码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2752 (KMP 所有可能长度的前缀后缀) Seek the Name, Seek the Fame

时间:2014-11-21 10:29:01      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   on   

题意:

求一个字符串的相同前缀后缀的所有可能的长度,这里该字符串其本身也算自己的前缀和后缀。

分析:

我们知道next数组的性质是,该字符之前的字符串的最大相同前缀后缀。

既然知道了最大的,即next[len]。

递归一次next[ next[len] ],就能求得更小的前缀。

不断的递归把所有所有可能的长度找出来,然后递归输出即可。

bubuko.com,布布扣
 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 }
代码君

 

POJ 2752 (KMP 所有可能长度的前缀后缀) Seek the Name, Seek the Fame

标签:style   blog   http   io   ar   color   os   sp   on   

原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4112063.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!