题意:
求一个字符串的相同前缀后缀的所有可能的长度,这里该字符串其本身也算自己的前缀和后缀。
分析:
我们知道next数组的性质是,该字符之前的字符串的最大相同前缀后缀。
既然知道了最大的,即next[len]。
递归一次next[ next[len] ],就能求得更小的前缀。
不断的递归把所有所有可能的长度找出来,然后递归输出即可。
1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 400000; 5 char p[maxn]; 6 int next[maxn], a[maxn], l; 7 8 void get_next(char* p, int l) 9 { 10 int k = -1, j = 0; 11 next[0] = -1; 12 while(j < l) 13 { 14 if(k == -1 || p[k] == p[j]) 15 { 16 k++; 17 j++; 18 next[j] = k; 19 } 20 else k = next[k]; 21 } 22 } 23 24 void output(int k) 25 { 26 if(next[k] > 0) output(next[k]); 27 if(k == l) printf("%d\n", l); 28 else printf("%d ", k); 29 } 30 31 int main() 32 { 33 freopen("in", "r", stdin); 34 35 while(scanf("%s", p) == 1) 36 { 37 memset(next, 0, sizeof(next)); 38 39 l = strlen(p); 40 get_next(p, l); 41 42 int cnt = 0; 43 a[cnt++] = l; 44 output(l); 45 } 46 47 return 0; 48 }
代码君
时间: 2025-01-15 22:03:37