Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=2594

扩展KMP

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int N=50010;
 6 char s1[N],s2[N];
 7 int next[N],ext[N];
 8 void getnext(char *sp)
 9 {
10     next[0]=strlen(sp);
11     int p=0;
12     while(sp[p+1] && sp[p]==sp[p+1]) p++;
13     next[1]=p;
14     for(int i=2,k=1;sp[i];i++)
15     {
16         if(next[i-k]+i>=next[k]+k)
17         {
18             int j=next[k]+k-i;
19             if(j<0) j=0;
20             while(sp[j+i] && sp[j]==sp[j+i]) j++;
21             next[k=i]=j;
22         }
23         else next[i]=next[i-k];
24     }
25 }
26 void exkmp(char *st,char *sp)
27 {
28     int p=0;
29     while(st[p] && st[p]==sp[p]) p++;
30     ext[0]=p;
31     for(int i=1,k=0;st[i];i++)
32     {
33         if(next[i-k]+i>=ext[k]+k)
34         {
35             int j=ext[k]+k-i;
36             if(j<0) j=0;
37             while(st[j+i] && st[j+i]==sp[j]) j++;
38             ext[k=i]=j;
39         }
40         else ext[i]=next[i-k];
41     }
42 }
43 int main()
44 {
45     while(~scanf("%s%s",s1,s2))
46     {
47         getnext(s1);
48         exkmp(s2,s1);
49         int len2=strlen(s2);
50         int i;
51         for(i=0;s2[i];i++)
52             if(i+ext[i]==len2) break;
53         if(i<len2) printf("%s ",s2+i);
54         printf("%d\n",len2-i);
55     }
56     return 0;
57 }

 

posted on 2012-11-19 18:32  Qiuqiqiu  阅读(136)  评论(0编辑  收藏  举报