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

Poj--3080Blue Jeans+KMP水题

时间:2015-08-16 12:27:35      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:kmp   字符串   

题目链接:点击进入
大概的题意就是给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水题

标签:kmp   字符串   

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

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