• poj-3080(kmp+暴力枚举)


    题意:给你多个字符串,问你这几个字符串的最长公共子串是哪个,如果有多个,输出字典序最大的那个,如果最长的公共子串长度小于3,输出一个奇怪的东西;

    解题思路:首先看数据,数据不大,开始简单快乐的暴力之路,因为是公共的子串,所以我们随便找一个原串,把它的子串全部循环一遍,然后所有的子串都去和剩余的原串跑一遍kmp,如果匹配没啥问题,那么这个子串是剩余所有原串的公共子串,然后更新答案;

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    char a[15][100];
    char t[100];
    char s[100];
    char char_ans[100];
    int next[100];
    int slen,tlen;
    bool bj(char x[],char y[],int w)
    {
        for(int i=0;i<w;i++)
        {
            if(x[i]==y[i])
                continue;
            if(x[i]>y[i])
            {
                return true;
            }
        }
        return false;
    }
    void get_next()
    {
        int j=0,k=-1;next[0]=-1;
        while(j<tlen)
        {
            if(k==-1||t[k]==t[j])
                next[++j]=++k;
            else
                k=next[k];
        }
    }
    int kmp_pos()
    {
        int i=0,j=0;
        get_next();
        while(i<slen&&j<tlen)
        {
            if(j==-1||s[i]==t[j])
            {
                i++;j++;
            }
            else
                j=next[j];
        }
        if(j==tlen)
            return i-tlen;
        else
            return -1;
    }
    int main()
    {
        int tt,n;
        int ans=-1;
        int cnt;
        int flag;
        scanf("%d
    ",&tt);
        while(tt--)
        {
            ans=-1;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                scanf("%s",a[i]);
            }
            for(int i=0;i<=59;i++)//从位置i开始
            {
                cnt=0;tlen=0;
                for(int j=i;j<=59;j++)//到位置j结束
                {
                    slen=60;
                    t[cnt]=a[1][j];tlen++;cnt++;//t串的赋值;
                    flag=0;
                    for(int k=2;k<=n;k++)//循环n个串找字串;
                    {
                        for(int l=0;l<60;l++)//s串的赋值,我的kmp的写法习惯无参数,所以t串,s串都要自己赋值;
                            s[l]=a[k][l];
                        int x=kmp_pos();
                        if(x==-1)
                            flag=1;
                    }
                    if(flag==0)//如果没有啥子问题
                    {
                        if(tlen==ans)//更新答案
                        {
                            if(bj(t,char_ans,tlen))
                               {
                                   for(int k=0;k<tlen;k++)
                                    char_ans[k]=t[k];
                               }
                        }
                        else if(tlen>ans)//更新答案
                        {
                            ans=tlen;
                            for(int k=0;k<tlen;k++)
                                    char_ans[k]=t[k];
                        }
                    }
                }
            }
            if(ans<3)
                printf("no significant commonalities
    ");
            else
            {
                for(int i=0;i<ans;i++)
                    printf("%c",char_ans[i]);
                printf("
    ");
            }
        }
    }
    

      

  • 相关阅读:
    WebQQ协议分析(9)——聊天(2)
    我的程序员之路(3)——学生时代(3)
    我的程序员之路(2)——学生时代(2)
    我的程序员之路(1)——学生时代(1)
    WebQQ协议分析——目录
    我的程序员之路(4)——工作半年
    WebQQ协议分析(7)——获取群信息(2)
    WebQQ协议分析(8)——聊天(1)
    VS2008编译器下ACE的配置
    WebQQ协议分析(10)——聊天(3)
  • 原文地址:https://www.cnblogs.com/huangdao/p/9437703.html
Copyright © 2020-2023  润新知