单词替换

 

 

1.kmp找到后替换即可

 1 #include<iostream>
 2 #include<cstring>
 3 #include<string>
 4 #include<cstdio>
 5 using namespace std;
 6 
 7 int nxt[5000005],ans[5000005]; 
 8 char s[5000005],p[5000005],q[5000005];
 9 
10 void getNext(char *p){
11     nxt[0]=-1;
12     int len=strlen(p);
13     for(int i=0;i<len;i++){
14         int k=nxt[i];
15         while(k!=-1&&p[i]!=p[k]) k=nxt[k];
16         nxt[i+1]=k+1;
17     }
18 }
19 
20 void kmp(char *s,char *p){
21     getNext(p);
22     memset(ans,-1,sizeof(ans)); //!!!!
23     int temp=0,t=0,lens=strlen(s),lenp=strlen(p);
24     while(1){
25         int i=temp,j=0;
26         while(i<lens&&j<lenp){
27              while(j!=-1&&s[i]!=p[j]) j=nxt[j];
28              ++i;
29              ++j;
30         }
31         if(j==lenp){
32              ans[t++]=i-j;
33              temp=i; 
34         }
35         if(i==lens) break;
36     }
37 }
38 
39 int main()
40 {   int n;scanf("%d",&n);
41     while(n--){
42         scanf("%s%s%s",s,p,q);
43         kmp(s,p);
44         int m_lens=strlen(s),m_lenp=strlen(p),t=0;
45         for(int i=0;i<m_lens;i++){
46             if(i!=ans[t]) printf("%c",s[i]);
47             else{
48                 printf("%s",q);
49                 t++;
50                 i+=m_lenp-1;
51             }
52         }
53         printf("\n");    
54     }
55     return 0;
56 }

 

posted @ 2017-05-16 20:55  天之道,利而不害  阅读(224)  评论(0编辑  收藏  举报