poj2752Seek the Name, Seek the Fame【kmp next数组应用】

大意:给你一个串,如果这个串存在一个长度为n的前缀串,和长度为n的后缀串,并且这两个串相等,则输出他们的长度n。求出所有的长度n

例如

‘alala'. Potential prefix-suffix strings of S are {'a', 'ala', 'alala'}

分析:考察对于next数组的理解

next数组表示i之前的k个字符与该串钱k个字符匹配

所以

next[l] 就表示最大后缀满足与前缀相同的最大字串

然后  在对获得的字串进行同样的求解  最终得到结果

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 const int maxn = 400005;
 7 
 8 int next[maxn];
 9 int ans[maxn];
10 
11 void get(char *s) {
12     int l = strlen(s);
13     int j = 0, k = -1;
14     next[0] = -1;
15     while(j < l) {
16         if(k == -1 || s[j] == s[k]) {
17             next[++j] = ++k;
18         } else {
19             k = next[k];
20         }
21     }
22 }
23 char s[maxn];
24 
25 int main() {
26     while(EOF != scanf("%s",s)) {
27         get(s);
28         int tot = 0;
29         int k = strlen(s);
30         while(k) {
31             ans[tot++] = k;
32             k = next[k];
33         }
34         for(int i = tot - 1; i >= 0; i--) {
35             printf(i == tot - 1 ? "%d" : " %d", ans[i]);
36         } puts("");
37     }
38 }
View Code
原文地址:https://www.cnblogs.com/zhanzhao/p/4761660.html