2013 ACM/ICPC Asia Regional Changchun Online hdu Theme Section

来源:互联网 发布:doge网络意思 编辑:程序博客网 时间:2024/04/30 15:16

题意:给定一个字符串,是否存在字符串的首部,尾部和中部 ,求最长的。

kmp解决。


#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N=1e6+50;int next[N];char str[N];void Get_Next(char *p,int len){    int j=1;    next[0]=-1;    int k=-1;    for(;j<len;j++)    {        while(k>-1&&p[k+1]!=p[j]) k=next[k];        if(p[k+1]==p[j]) k++;        next[j]=k;    }}bool Check(int l,int r){    int i=l,j=-1;    while(i<r)    {        while(j>-1&&str[i]!=str[j+1]) j=next[j];        if(str[j+1]==str[i]) j++;        i++;        if(j==l-1) return true;    }    return false;}int main(){    int ncase,i,len;    scanf("%d",&ncase);    while(ncase--)    {        scanf("%s",str);        len=strlen(str);        Get_Next(str,len);        i=next[len-1];        while(i>=(len/3)&&(i!=-1)) i=next[i];//分成三段,每段的长度不超过len/3        int ans=0;        while(i!=-1)        {            int l=i+1,r=len-i-1;            bool flag=Check(l,r);            if(flag)            {                ans=i+1;                break;            }            i=next[i];        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击