hdu-1238(kmp+枚举)

Posted huangdao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu-1238(kmp+枚举)相关的知识,希望对你有一定的参考价值。

题意:给你n个字符串,问你这里面最长的公共子串的长度是多少,一个公共子串的反串也算,比如样例二;

解题思路:随便找一个字符,枚举它的子串然后跑kmp就行了,很多人的博客都是用string类里面的函数来解决的,学到了。。。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define maxn 205
using namespace std;
char x[maxn][maxn];
char str[maxn];
char str2[maxn];
int next1[maxn];
int cnt,cot;
void get_next(char *t)
{
    int j,k;
    int tlen=cnt;
    j=0;k=-1;next1[0]=-1;
    while(j<tlen)
    {
        if(k==-1||t[j]==t[k])
            next1[++j]=++k;
        else
            k=next1[k];
    }
}
int kmp_pos(char *t,char *s)
{
    int slen=strlen(s);
    int tlen=cnt;
    int i=0,j=0;
    get_next(t);
    while(i<slen&&j<tlen)
    {
        if(j==-1||s[i]==t[j])
        {
            i++;j++;
        }
        else
            j=next1[j];
    }
    if(j==tlen)
        return i-tlen;
    return -1;

}
int main()
{
    int tt;
    int n;
    int ans;
    int maxx;
    int l;
    scanf("%d",&tt);
    while(tt--)
    {
        maxx=-1;l=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%s",x[i]);
        int m=strlen(x[1]);
        for(int i=0;i<m;i++)
        {
            cnt=0;
            for(int j=i;j<m;j++)
            {
                ans=0;cot=0;
                str[cnt++]=x[1][j];
                for(int k=cnt-1;k>=0;k--)
                str2[cot++]=str[k];
                /*for(int k=0;k<cnt;k++)
                    cout<<str[k];
                cout<<endl;
                for(int k=0;k<cnt;k++)
                    cout<<str2[k];
                cout<<endl;*/
                for(int k=1;k<=n;k++)
                {
                    int flag1=kmp_pos(str,x[k]);
                    int flag2=kmp_pos(str2,x[k]);
                    if(flag1==-1&&flag2==-1)
                        continue;
                    ans++;

                }
                if(ans==n)
                {
                    l=max(l,cot);
                }
            }
        }
        printf("%d
",l);

    }
}

  

 

以上是关于hdu-1238(kmp+枚举)的主要内容,如果未能解决你的问题,请参考以下文章

hdu-2328(暴力枚举+kmp)

hdu1238 kmp

hdu1238 Substrings 扩展KMP

kuangbin专题十六 KMP&&扩展KMP HDU1238 Substrings

HDU 1238 Substrings (水)

hdu 1238 字符串处理 暴力