Poj--3080Blue Jeans+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;
}

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

时间: 2024-10-13 02:51:59

Poj--3080Blue Jeans+KMP水题的相关文章

poj 2369 Permutations 置换水题

找循环节求lcm就够了,若答案是12345应该输出1,被坑了下. #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> using namespace std; #define INF 0x3FFFFFF #define MAXN 2222 #define eps 1e-6 i

poj 1006:Biorhythms(水题,经典题,中国剩余定理)

Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 110991   Accepted: 34541 Description Some people believe that there are three cycles in a person's life that start the day he or she is born. These three cycles are the physical,

poj 1002:487-3279(水题,提高题 / hash)

487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 236746   Accepted: 41288 Description Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phras

POJ 1488 Tex Quotes --- 水题

POJ 1488 题目大意:给定一篇文章,将它的左引号转成 ``(1的左边),右引号转成 ''(两个 ' ) 解题思路:水题,设置一个bool变量标记是左引号还是右引号即可 /* POJ 1488 Tex Quotes --- 水题 */ #include <cstdio> #include <cstring> int main() { #ifdef _LOCAL freopen("D:\\input.txt", "r", stdin); #

poj 1003:Hangover(水题,数学模拟)

Hangover Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 99450   Accepted: 48213 Description How far can you make a stack of cards overhang a table? If you have one card, you can create a maximum overhang of half a card length. (We're as

Poj 1094 拓扑排序 水题

Sad..这么水的题WA了无数发,题目要看仔细啊,留下来做个警告把 #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #i

poj 2497 Strategies 模拟水题

水题,直接贴代码. //poj 2497 //sep9 #include <iostream> #include <algorithm> using namespace std; int a[32]; int main() { int cases,c=0; scanf("%d",&cases); while(cases--){ int tot,n; scanf("%d%d",&tot,&n); int x2,y2,t;

POJ 3080--Blue Jeans【KMP &amp;&amp; 暴力枚举】

Blue Jeans Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14316   Accepted: 6374 Description The Genographic Project is a research partnership between IBM and The National Geographic Society that is analyzing DNA from hundreds of thousa

poj - 3080-Blue Jeans

Blue Jeans Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17434   Accepted: 7728 Description The Genographic Project is a research partnership between IBM and The National Geographic Society that is analyzing DNA from hundreds of thousa