标签:
题意:给你两个串,问你第二个串是从第一个串的什么位置开始完全匹配的? kmp裸题,复杂度O(n+m)。
当一个字符串以0为起始下标时,next[i]可以描述为"不为自身的最大首尾重复子串长度"。
当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 并且next[j]恰好等于这个最大长度。
防止超时,注意一些细节。。
另外:尽量少用strlen,变量记录下来使用比较好,用字符数组而不用string
//KMP算法模板题 //hdu 1711 #include<iostream> #include<string.h> using namespace std; int a[1000010]; int b[10010]; int next1[10010]; void getnext(int len)//参数是子串的长度 { int i=0,j=-1; next1[0]=-1; while(i<len) { if(j==-1||b[i]==b[j]) { i++; j++; next1[i]=j; } else j=next1[j]; } } int KMP(int n,int m)//参数是原始串和子串的长度 { int i=0,j=0;//注意是0 while(i<n&&j<m) { if(j==-1||a[i]==b[j]) { i++; j++; } else j=next1[j]; } if(j==m)//已经找到,注意如果下表为1,改为i-j+1; return i-j; else return -1; } int main() { int T; int n,m; cin>>T; while(T--) { cin>>n>>m; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<m;i++) cin>>b[i]; getnext(m); int ans=KMP(n,m); cout<<ans<<endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/nk_test/article/details/47011653