hdu 4763 Theme Section KMP
2014-08-28 10:17
471 查看
题意:找到一个最长的子串,使得原串的前缀和后缀都和这个子串相同,且3者无交叉。
对原串求一次next,我们发现若顺着next
走下去,得到的前缀一定和原后缀匹配,这样就满足了前后相等。
然后只要暴力查找中间是否出现了这个前后缀就够了。
理论复杂度n^2,但是实际不会出现那种情况。
对原串求一次next,我们发现若顺着next
走下去,得到的前缀一定和原后缀匹配,这样就满足了前后相等。
然后只要暴力查找中间是否出现了这个前后缀就够了。
理论复杂度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 ;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; }
相关文章推荐
- 2013长春网赛1005 hdu 4763 Theme Section(kmp应用)
- HDU 4763 Theme Section(KMP)
- HDU 4763 Theme Section(KMP)
- KMP-hdu-4763-Theme Section
- hdu 4763 Theme Section(KMP)
- HDU - 4763 Theme Section(拓展kmp)
- hdu 4763 Theme Section (kmp next应用)
- Hdu 4763 Theme Section (kmp)
- HDU 4763 Theme Section (KMP)
- hdu 4763 Theme Section (kmp, Next数组的应用)
- Hdu 4763 Theme Section (KMP+暴力 或 exKMP)
- hdu 4763 Theme Section(KMP)
- hdu 4763 Theme Section(kmp)
- 【HDU 4763】Theme Section(KMP)
- hdu 4763 Theme Section kmp
- HDU 4763 Theme Section(KMP:后缀与前缀)
- 【HDU】 4763 Theme Section (KMP)
- hdu 4763 Theme Section (扩展kmp)
- HDU 4763 Theme Section (2013长春网络赛1005,KMP)
- HDU 4763 Theme Section(KMP)