标签:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 14188 | Accepted: 7068 |
Description
Input
Output
Sample Input
ababcababababcabab aaaaa
Sample Output
2 4 9 18 1 2 3 4 5
题意:给一个字符串S,判断在什么下标的时候,前缀和后缀相等,输出前缀和后缀相等的点。
分析:next数组的一种很巧妙的用法
next数组表示的意义是当前下标前面k字符和开头的前面k个字符相等
所以就会有xy=ab(用xy表示x~y的这一段),则next[b]=y,那么下次就从y这个位置开始匹配
如果xk=wy,因为xy=ab,故wy=lb,所以xk=lb,就得到了前缀和后缀相等。
如此匹配直到next[i]=-1,期间记录下下标
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<string> #include<iostream> #include<cstring> #include<cmath> #include<stack> #include<queue> #include<vector> #include<map> #include<stdlib.h> #include<algorithm> #define LL __int64 using namespace std; const int MAXN=100000+5; char str[MAXN]; int nex[MAXN]; int ans[MAXN]; int n; void getnext() { int j=0,k=-1; nex[0]=-1; while(j<n) { if(k==-1 || str[j]==str[k]) nex[++j]=++k; else k=nex[k]; } } int main() { //freopen("in.txt","r",stdin); while(scanf("%s",str)!=EOF) { n=strlen(str); getnext(); int i=n,tot=0; while(nex[i]!=-1) { ans[tot++]=i; i=nex[i]; } for(int i=tot-1;i>=0;i--) { if(i==tot-1) printf("%d",ans[i]); else printf(" %d",ans[i]); } printf("\n"); } return 0; }
POJ 2752 Seek the Name, Seek the Fame (KMP的next函数运用)
标签:
原文地址:http://www.cnblogs.com/clliff/p/4719439.html