Poj--3080Blue Jeans+KMP水題

acm_lkl發表於2020-04-04

題目連結:點選進入
大概的題意就是給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;
}

相關文章