码迷,mamicode.com
首页 > 其他好文 > 详细

hdu-1238(kmp+枚举)

时间:2018-08-15 19:36:17      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:fine   字符   namespace   class   har   pos   std   name   efi   

题意:给你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\n",l);

    }
}

  

 

hdu-1238(kmp+枚举)

标签:fine   字符   namespace   class   har   pos   std   name   efi   

原文地址:https://www.cnblogs.com/huangdao/p/9483414.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!