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

题意:

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

分析:

我们知道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

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

hdu 1686 &amp; poj 2406 &amp; poj 2752 (KMP入门三弹连发)

首先第一题 戳我穿越;http://acm.hdu.edu.cn/showproblem.php?pid=1686 题目大意好理解,每组输入一个子串和一个母串,问在母串中有多少个子串? 文明人不要暴力,因为宽度会超时,除去暴力后这就是赤果果的KMP KMP的重点在于在子串中建立一个匹配表,记录 到每一位的 前缀后缀 中的相同的子子串的最大长度 然后在比较子母串的时候当遇到不同时 后移的位数就是前面相同的个数减去对应的匹配表例的数 额 讲的不清不楚 那推荐戳这里:http://kb.cnblogs

kmp(所有长度的前缀与后缀)

http://poj.org/problem?id=2752 Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27512   Accepted: 14244 Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and aske

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher H - Seek the Name, Seek the Fame POJ - 2752(kmp的next数组应用)

H - Seek the Name, Seek the Fame POJ - 2752 题目链接:https://vjudge.net/contest/70325#problem/H 题目: The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names to their newly-born babies. Th

POJ 2752 (KMP)

题目链接:http://poj.org/problem?id=2752 题意:给一个字符串,判断前缀和后缀是相同的位置,把这些位置从小到大输出出来. 题解:通过字符串得到next数组,然后从next[len]开始.其值就是最后一个是相同前缀后缀的位置,然后,i=next[i],就是不断的向前找,就匹配了过去. 代码如下: 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<

poj 2752 kmp(next数组的应用)

Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16036   Accepted: 8159 Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names t

POJ 2752+KMP+利用next数组性质求出所有相同的前缀和后缀

题目链接:点击进入 这个题目要求所有相同的前缀和后缀的长度.我们可以利用KMP算法中next数组的性质,在next[len]这个点不断的失配下去,这样就可以将所有相同的前后缀的长度求出来.还要注意这个中整个串的长度也可以看成是一个合法的解. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=400000+100; char str

POJ 2752 KMP中next数组的理解

感觉这里讲的挺好的.http://cavenkaka.iteye.com/blog/1569062 就是不断递归next数组.长度不断减小. 题意:给你一个串,如果这个串存在一个长度为n的前缀串,和长度为n的后缀串,并且这两个串相等,则输出他们的长度n.求出所有的长度n. 思路:KMP中的get_next().对前缀函数next[]又有了进一步的理解,str[1]~~str[next[len]]中的内容一定能与str[1+len-next[len]]~~str[len]匹配(图1).然后呢我们循

poj 2752 kmp的next数组

题目大意: 求一个字符串中某一个既是前缀又是后缀的前缀的结尾下标: 基本思路: 从_next[len]开始找_next[_next[len]],再找_next[_next[_next[len]]],一直找到0: 代码如下: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 4000

POJ2752 Seek the Name, Seek the Fame【KMP】

题目链接: http://poj.org/problem?id=2752 题目大意: 给定一个字符串S,计算出所有可能的前缀-后缀字符串的长度.前缀-后缀字符串指的是S的 子串不仅是S的前缀,还是S的后缀.比如S = "alala",前缀-后缀字符有{"a","ala","alala"}. 思路: KMP算法的应用.在KMP算法中,当字符串匹配失败时,模式串的指针并没有指向0从头比 较,而是指向了一个特定的位置,因为这个Nex