标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763
题意就是求s串中满足EAEBE格式的E的最大长度;我们可以枚举前缀和后缀的所有匹配(k)看是否在s[k,len-k]中;
如果不在它中间那么就让k=Next[k],刚开始想的是k--;但是这样循环次数有点多(本题数据太水,k--也能过);
但是s[0,k-1]和s[len-k-1,len-1]不一定一样啊,如果是Next[k]的话那么前缀Next,即前缀的前缀和后缀肯定相等并且等于后缀的后缀(有点模
糊好好想想就明白了。。。)
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int N = 1e6+7; int Next[N]; char s[N], ss[N], sm[N]; void GetNext(char s[], int n) { int i=0, j=-1; Next[0] = -1; while(i<n) { if(j==-1 || s[i]==s[j]) Next[++i] = ++j; else j = Next[j]; } } bool kmp(char a[], int n, char b[], int m) { int i=0, j=0; while(i < m) { if(j==-1 || a[j] == b[i]) i++,j++; else j = Next[j]; if(j == n) return true; } return false; } int main() { int n; scanf("%d", &n); for(int i=0; i<n; i++) { scanf("%s", s); int len = strlen(s); GetNext(s, len); int k = Next[len]; while(k>len/3)k=Next[k]; while(k>0) { memset(ss, 0,sizeof(ss)); strncpy(ss, s, k);///一定不要忘记初始化; memset(sm, 0,sizeof(sm)); strncpy(sm, s+k, len-2*k); if(kmp(ss, k, sm, len-2*k)==true) break; else k=Next[k]; } printf("%d\n", k); } return 0; }
Theme Section---hdu4763(kmp, Next数组的运用)
标签:
原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4853736.html