zoukankan      html  css  js  c++  java
  • 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);
    
        }
    }
    

      

  • 相关阅读:
    linux sleep用法
    linux下set命令的参数及用法
    给vim编辑器自动添加行号
    linux一些基本常识(三)
    shell脚本面试题
    linux下字符串的比较方式
    浅谈Windows API编程
    WIN32 API ------ 最简单的Windows窗口封装类
    Microsoft函数调用约定
    Android UI 设计规范
  • 原文地址:https://www.cnblogs.com/huangdao/p/9483414.html
Copyright © 2011-2022 走看看