首页 > 代码库 > hdu 4763 Theme Section KMP
hdu 4763 Theme Section KMP
题意:找到一个最长的子串,使得原串的前缀和后缀都和这个子串相同,且3者无交叉。
对原串求一次next,我们发现若顺着next[n]走下去,得到的前缀一定和原后缀匹配,这样就满足了前后相等。
然后只要暴力查找中间是否出现了这个前后缀就够了。
理论复杂度n^2,但是实际不会出现那种情况。
#include<cstring> #include<cstdio> #include<algorithm> using namespace std; #define MAXN 1000005 int next[MAXN]; char p[MAXN]; void getnext(char *p,int n) //预处理里得到next数组 { for(int i=1;i<n;i++) { int j=next[i]; while(j&&p[i]!=p[j]) { j=next[j]; } if(p[i]==p[j]) { next[i+1]=j+1; } else { next[i+1]=0; } } } int kmp(char *s,char *p,int n,int m) //返回匹配位置,-1未找到 { int j=0; for(int i=0;i<n;i++) { while(j&&s[i]!=p[j]) j=next[j]; if(s[i]==p[j]) j++; if(j==m) { return i-m+1; } } return -1; } int main() { int cas; scanf("%d",&cas); while(cas--) { scanf("%s",p); int n=strlen(p); getnext(p,n); int ans=0; for(int l=next[n];l;l=next[l]) { if(n>=l+l+l&&(~kmp(p+l,p,n-l-l,l))) { ans=l; break; } } printf("%d\n",ans); } return 0; }
hdu 4763 Theme Section KMP
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。