[KMP]hdoj 4763

题意:

    给出一个字符串,问是否存在这样的子串E使得字符串可以表示为EAEBE的形式,其中EAB的长度都为任意值,存在的话输出E的最长长度,否则输出-1

 

大致思路:

    参考http://bbezxcy.iteye.com/blog/1378468 求字符串中存在多少子串使得其既是字符串的前缀也是字符串的后缀。这道题求出所有符合的后缀之后,再判断是否有子串可以成为中间的那个E,并选出长度最小的即可

 

#include<iostream>
#include<cstring>
#include<stack>
#include<cstdio>
#include<map>
using namespace std;
const int nMax=1000005;
char pat[nMax];
int lenp,next[nMax];

void get_next(){
    int i,j=-1;
    next[0]=-1;
    for(i=1;i<=lenp;i++){
        while(j>-1&&pat[j+1]!=pat[i])j=next[j];
        if(pat[j+1]==pat[i])j++;
        next[i]=j;
    }
}

map<int,int>mpp;
int main(){
    int i,j,k,tcs;
    scanf("%d",&tcs);
    while(tcs--){
        scanf("%s",pat);
        lenp=strlen(pat);
        mpp.clear();
        get_next();
        j=next[lenp-1];
        while(j!=-1){
            mpp[j]=1;
            j=next[j];
        }
        int res=-1;
        for(i=0;i<lenp;i++){
            if(mpp[next[i]]!=0){
                if(i-next[i]+1>next[i]&&lenp-i-1>=next[i]+1){
                    res=max(res,next[i]);
                }
            }
        }
        cout<<res+1<<endl;
    }
    return 0;
}

 

你可能感兴趣的:(KMP)