2013 长春网络赛 1005 Theme Section

来源:互联网 发布:开淘宝大概费用是多少 编辑:程序博客网 时间:2024/04/29 05:22

给出字符串,形如EAEBE,求E最长长度。

先求kmp的next数组,那么对第i个字符,str[0,next[i]]与str[i-next[i],i]相同。现在找出尾部的E,然后去查找中间的E是否满足长度为next[len-1],

当不满足时,j=next[j],缩短与首部的匹配长度,这样直到j=-1为止。

#include <cstdio>#include <cstring>#include <iostream>using namespace std;typedef long long ll;const int maxn=1000001;char str[maxn];int next[maxn];int main(){    freopen("in.txt","r",stdin);    int n,j,len;    scanf("%d",&n);    while(n--)    {        scanf("%s",str);        next[0]=-1,j=-1;        len=strlen(str);//        cout<<str<<endl;        for(int i=1;i<len;i++)        {            while(j>=0&&str[i]!=str[j+1])            {                j=next[j];            }            if(str[i]==str[j+1])                j++;            next[i]=j;//            cout<<i<<" "<<j<<endl;        }        int ans=0,j=len-1;        while(next[j]>=0)        {//            cout<<next[j]<<endl;            if(next[j]>len/3)            {                j=next[j];            }            else            {                for(int i=next[j]+1;i<len-next[j];i++)                {                    if(next[i]==next[j])                    {                        ans=next[i]+1;                        break;                    }                }            }            j=next[j];            if(ans||j==-1)                break;        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击