剛哥遇到了感情問題(二) 時間限制:1000 ms | 記憶體限制:65535 KB 難度:1 描述 上一集我們講到 作為工作室老大的剛哥遇到很多女生的追求,你幫他個挑選了個英語成績不錯的物件。在你
# define N 201
char A[][7]={"apple","banana","orange"}; //A->B
char B[][5]={"miss","love","kiss"};
int S[]={4,5,5},num,D[2][N];
char C[N];
int BF(char a[],char b[],int c[]);//返回b字串在a中的個數 c儲存b在a中的下標 從c[num]開始儲存 num為全域性變數
void change(int *a,int *b);//交換函式
void Qsort(int A[][N],int left,int right);//快速排序 升序
int main(){
int i,j,k;
//freopen("AAA.txt","r",stdin);
while(gets(C)){
for(i=j=num=0;i<3;i++)//用 A[i]匹配C 返回匹配的個數
{
k=BF(C,A[i],D[0]);//k記錄A[i]匹配的個數
while(k--)D[1][j++]=i;//D[1]用來儲存i
}
Qsort(D,0,num-1);//以A[0]升序 從下標0--- num-1 一共num個
for(i=j=0;C[i];i++){//輸出
if(i==D[0][j]&&j<num)
{
printf("%s",B[D[1][j]]);
i+=S[D[1][j++]];
}
else printf("%c",C[i]);
}
printf("\n");//輸出回車符
}
return 0;
}
int BF(char a[],char b[],int c[]){//返回b字串在a中的個數 c儲存b在a中的下標 從c[num]開始儲存 num為全域性變數
int i=0,j=0,k=num;//k儲存當前已經匹配的個數
do{
if (b[j]&&a[i++]==b[j])++j;//如果匹配成功 繼續向下匹配
else
{
b[j]?(i-=j):(c[num++]=i-j);//b字串到頭了嗎?如果到頭了即b[j]=0 此時 c儲存匹配下標 否則i回溯
j=0;//無論匹配成功與否 b都要重新和a檢測
}
}while(a[i-1]);
return num-k;//返回b在a中匹配的個數
}
void change(int *a,int *b){//交換函式 交換a b的值
int c=*a;
*a=*b;
*b=c;
}
void Qsort(int A[][N],int left,int right)//不需要知道內部 只需要知道是升序就行了
{
int i=left,j=right,temp=A[0][left];
if(left>=right) return;
while(i!=j)
{
while(A[0][j]>=temp && i<j) j--;
while(A[0][i]<=temp && i<j)i++;
if(i<j)
{
change(&A[0][i],&A[0][j]);
change(&A[1][i],&A[1][j]);
}
}
change(&A[0][left],&A[0][i]);
change(&A[1][left],&A[1][i]);
Qsort(A,left,i-1);
Qsort(A,i+1,right);
}