hdu 2594(kmp)

 1 /*
 2 *      KMP
 3 *      思路:把两个串连接,然后求next[]数组值
 4 *      注意:当两个串都是重复串且重复子串一样是,要特殊处理
 5 */
 6 
 7 #include <cstdio>
 8 #include <iostream>
 9 
10 using namespace std;
11 
12 const int N = 50005;
13 
14 int next[N<<1];
15 char str[N<<1], pat[N];
16 
17 void indexNext() {
18     int k = 0;
19     next[1] = 0;
20     for (int i=2; str[i]; ++i) {
21         while (k && str[k+1]!=str[i]) k = next[k];
22         if (str[k+1] == str[i]) ++k;
23         next[i] = k;
24     } 
25 }
26 
27 void solve() {
28     int lenPat = strlen(pat);
29     int lenStr = strlen(str);
30     int len = lenStr + lenPat - 1;
31     for (int i=1; i<lenPat; ++i) str[lenStr+i-1] = pat[i];
32     str[len] = '\0';
33     indexNext();
34     if ((len-1)%(len-next[len-1]-1)==0 && next[len-1]!=0) {//特殊处理的数据
35         if (lenStr > lenPat) lenStr = lenPat;
36         for (int i=1; i<lenStr; ++i) printf ("%c", str[i]);
37         printf (" %d\n", lenStr-1);
38     }
39     else if (next[len-1] == 0) printf ("0\n");
40     else {
41         for (int i=1; i<=next[len-1]; ++i) printf ("%c", str[i]);
42         printf (" %d\n", next[len-1]);
43     }
44 }
45 
46 int main() {
47     str[0] = pat[0] = '#';
48     while (scanf("%s%s", str+1, pat+1) != EOF) {
49         solve();
50     }
51     return 0;
52 } 

 

posted on 2012-05-07 07:01  Try86  阅读(278)  评论(0)    收藏  举报