poj 2752

http://poj.org/problem?id=2752

题意:给一个字符串,问你前缀和后缀相同的位置有哪些

思路:很意思的一个题目,也发现了next数组隐藏着一个规律,就是next[len]的值就是最大前缀后缀相同的个数

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <vector>
 4 #include <algorithm>
 5 const int maxn = 1e6+5;
 6 using namespace std;
 7
 8 int next[maxn];
 9 char str[maxn];
10
11 vector<int>s;
12
13 void getnext(char str[])
14 {
15     int len = strlen(str);
16     next[0] = -1;
17     int i = 0,j = -1;
18     while(i<len)
19     {
20         if(j==-1||str[i]==str[j])
21             next[++i] = ++j;
22         else
23             j = next[j];
24     }
25 }
26
27
28 int main()
29 {
30     while(~scanf("%s",str))
31     {
32         s.clear();
33         memset(next,0,sizeof(next));
34         getnext(str);
35         int len = strlen(str);
36         while(len){
37             s.push_back(len);
38             len = next[len];
39         }
40         sort(s.begin(),s.end());
41         printf("%d",s[0]);
42         for(int i = 1;i<s.size();i++)
43             printf(" %d",s[i]);
44         printf("\n");
45     }
46     return 0;
47 }
时间: 2024-10-12 22:30:24

poj 2752的相关文章

poj 2752 Seek the Name, Seek the Fame KMP

对于KMP算法中next函数的应用 题意是对于一个字符串的前缀和后缀比较是否相等,再把相等的可能按字符串长度进行输出 #include <iostream> #include<stdio.h> #include<string.h> using namespace std; int len; int next[1000005]; char s[1000005]; int kmp_next() { int i=0,j=-1; next[0]=-1; while(i<l

POJ - 2752 - Seek the Name, Seek the Fame (KMP-打印前缀后缀长度)

题目传送:POJ - 2752 思路:就是每次都去找当前串的最大相同前缀后缀,找到一个后,令该相同前缀后缀为当前串,再循环调用,注意因为kmp的next函数中的最大相同前缀后缀不包含自身,所以每次都要多输出原串自身长度 AC代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1000005; char s[maxn]; in

Seek the Name, Seek the Fame poj 2752

Seek the Name, Seek the Fame Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Problem Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give n

POJ 2752 深刻理解KMP失配指针

思路:刚开始还在想怎么做,虽然以前是理解了失配指针的用处,但是确实不知道失配指针还有如此用处,其实还有很多用处,我用得少了不懂而已. 比如: i   0  1  2  3  4  5   6  7  8  9  10 11 p[i]  A  B R A  C  A  D  A  B  R  A  无 next[i]  0  0  0  0  1  0   1  0  1   2  3   4 next[11]=4这个肯定可以取了,因为这个后缀等于前缀嘛,然后再查询next[next[11]]=n

POJ 2752 Seek the Name, Seek the Fame KMP题解

本题是KMP的next数组的灵活运用. 具体就是看最后整个数列的最后一个字母,能有多少前缀. 理解了next数组就很容易了. #include <stdio.h> #include <string.h> #include <vector> using std::vector; const int MAX_N = 400001; char name[MAX_N]; int next[MAX_N], len; void genNext() { for (int i = 1,

[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<

【kmp+求所有公共前后缀长度】poj 2752 Seek the Name, Seek the Fame

http://poj.org/problem?id=2752 [题意] 给定一个字符串,求这个字符串的所有公共前后缀的长度,按从小到达输出 [思路] 利用kmp的next数组,最后加上这个字符串本身 [AC] 1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<cstdio> 5 #include<algorithm> 6 using namespace s

(KMP)Seek the Name, Seek the Fame -- poj --2752

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