首页 > 其他 > 详细

Poj--3080Blue Jeans+KMP水题

时间:2015-08-16 12:26:28      阅读:159      评论:0      收藏:0      [点我收藏+]

题目链接:点击进入
大概的题意就是给n个字符串,然后让我们找出他们的最长的公共子串。
因为题目的数据比较小,我们可以枚举第一个串的所有子串,然后再用KMP判断一下这个子串是否出现在其它字符串中。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn=100;

///x是模式串,m是长度,next是模式串对应的next数组
void kmp_pre(char x[],int m,int next[])
{
    int  i,j;
    j=next[0]=-1;
    i=0;
    while(i<m)
    {
        while(-1!=j&&x[i]!=x[j])
          j=next[j];
        next[++i]=++j;
    }
}

int next[maxn];

///x是模式串,y是主串
bool KMP_count(char x[],int m,char y[],int n)
{
    int i,j;
    int ans=0;
    kmp_pre(x,m,next);
    i=j=0;
    while(i<n)
    {
        while(-1!=j&&y[i]!=x[j])
          j=next[j];
        i++;j++;
        if(j>=m)
            return true;
    }
    return false;
}

char ans[maxn];
char str[20][maxn];

int main()
{
    int t;
    freopen("in.txt","r",stdin);
    scanf("%d",&t);
    bool flag;
    char x[maxn];
    while(t--)
    {
        int n,k;
        flag=false;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
          scanf("%s",str[i]);
        int len=strlen(str[0]);
        for(int i=0;i<len;i++)
        {
            int cnt=0;
            x[cnt++]=str[0][i];
          for(int j=i+1;j<len;j++)
          {
              x[cnt++]=str[0][j];
              for(k=1;k<n;k++)
              {
                  if(!KMP_count(x,cnt,str[k],strlen(str[k])))
                      break;
              }
              if(k>=n)
              {
                  if(!flag||cnt>strlen(ans))
                  {
                    x[cnt]=‘\0‘; ///必须自己加上字符串结束标志
                    strcpy(ans,x);
                    flag=true;
                  }
                  else
                  {
                     x[cnt]=‘\0‘;
                     if(cnt==strlen(ans)&&strcmp(x,ans)<0)
                       strcpy(ans,x);
                  }
              }
          }
        }
        if(!flag||strlen(ans)<3)
        {
            printf("no significant commonalities\n");
            continue;
        }
        printf("%s\n",ans);
    }
  return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Poj--3080Blue Jeans+KMP水题

原文:http://blog.csdn.net/acm_lkl/article/details/47700559

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!