标签:style os io for ar amp size ef
思路:刚开始还在想怎么做,虽然以前是理解了失配指针的用处,但是确实不知道失配指针还有如此用处,其实还有很多用处,我用得少了不懂而已。
比如:
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]]=next[4]=1,即ABRA的后缀等于前缀的个数为1,而字符串p后缀也有ABRA,所以求第4个位置的next值即整个字符串后缀等于前缀的下一个值……然后一下个值再求next[next[4]]=next[1]=0就是下一个后缀等于前缀的个数了。如此循环下去即可。
这样说理解了吧。next失配数组确实太强大了!
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define llson j<<1,l,mid #define rrson j<<1|1,mid+1,r #define INF 0x7fffffffffffffff #define maxn 400050 using namespace std; typedef long long ll; typedef unsigned long long ull; char s[maxn]; int next[maxn],len,a[maxn]; void getfail() { len=strlen(s); next[0]=next[1]=0; for(int i=1;i<len;i++) { int j=next[i]; while(j&&s[i]!=s[j]) j=next[j]; next[i+1]=s[i]==s[j]?j+1:0; } } int main() { //freopen("1.txt","r",stdin); while(~scanf("%s",s)) { getfail(); int cnt=0; a[cnt++]=len; while(next[len]) { a[cnt++]=next[len]; len=next[len]; } for(int i=cnt-1;i>0;i--) printf("%d ",a[i]); printf("%d\n",a[0]); } return 0; }
POJ 2752 深刻理解KMP失配指针,布布扣,bubuko.com
标签:style os io for ar amp size ef
原文地址:http://blog.csdn.net/u011466175/article/details/38678885