[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher I POJ 3080

来源:互联网 发布:淘宝电商是什么意思 编辑:程序博客网 时间:2024/05/16 06:16

题目地址:https://vjudge.net/contest/70325#problem/I

思路:暴力枚举+KMP。

AC代码:

#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int maxn=60+10;char a[15][maxn];char t[maxn],s[maxn];char res[maxn];int tlen,slen;int Next[maxn];int caset;void getNext(){    int j,k;    j=0,k=-1,Next[0]=-1;    while(j<tlen)    {        if(k==-1 || t[j]==t[k])            Next[++j]=++k;        else            k=Next[k];    }}int KMP_Index(){    int i=0,j=0;    while(i<slen && j<tlen)    {        if(j== -1 || s[i]==t[j])            i++,j++;        else            j=Next[j];    }    if(j==tlen)        return 1;    else        return 0;}int main(){    scanf("%d",&caset);    while(caset--)    {        memset(res,0,sizeof(res));        memset(a,0,sizeof(a));        int n;        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%s",a[i]);            int ll=strlen(a[1]);            int ans=-1;       for(int i=0;i<ll;i++)       {           int num=0;           for(int j=i;j<ll;j++)           {            t[num++]=a[1][j];            int flag=true;            tlen=strlen(t);            getNext();            //printf("%s  %d\n",t,i);            for(int k=2;k<=n;k++)            {                strcpy(s,a[k]);                slen=strlen(s);                if(!KMP_Index())                {                    flag=false;                     break;                }            }            if(!flag)                continue;            if(tlen==ans)            {                if(strcmp(t,res)<0)                    strcpy(res,t);            }            else if(tlen>ans)            {                ans=tlen;                strcpy(res,t);            }           }           memset(t,0,sizeof(t));       }       if(ans<3)        printf("no significant commonalities\n");       else        puts(res);    }}


0 0
原创粉丝点击