最大公共子串

来源:互联网 发布:淘宝穿过的衣服退货 编辑:程序博客网 时间:2024/06/10 10:33

Problem Description

从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩下地字符按原来顺序组成的串。例如:“ ”,“a”,“xb”,“aaa”,“bbb”,“xabb”,“xaaabbb”都是串“xaaabbb”的子串。(例子中的串不包含引号。)
 
编程求N个非空串的最长公共子串的长度。限制:2<=N<=100;N个串中的字符只会是数字0,1,…,9或小写英文字母a,b,…,z;每个串非空且最多含100个字符;N个串的长度的乘积不会超过30000。

Input

文件第1行是一个整数T,表示测试数据的个数(1<=T<=10)。接下来有T组测试数据。各组测试数据的第1行是一个整数Ni,表示第i组数据中串的个数。各组测试数据的第2到N+1行中,每行一个串,串中不会有空格,但行首和行末可能有空格,这些空格当然不算作串的一部分。

Output

输出T行,每行一个数,第i行的数表示第i组测试数据中Ni个非空串的最长公共子串的长度。

Example Input

13abbccd

Example Output

0


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
int leftup=1,left=2,up=3;
int sum[110][110];
int pt[110][110];
char s[110][110];
int main()
{
    int f(char s1[110],char s2[110]);
    int i,j,n,m,t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(i=0;i<=n-1;i++)
        {
            scanf("%s",s[i]);
        }
        for(i=1;i<=n-1;i++)
        {
            m=f(s[0],s[i]);
            if(m==0)
            {
                break;
            }
        }
        cout<<m<<endl;
    }
    return 0;
}
int f(char s1[110],char s2[110])
{
    int l1=strlen(s1);
    int l2=strlen(s2);
    char s3[110];
    int i,j,n,m,x,key,val,y,len,max;
    memset(sum,0,sizeof(sum));
    memset(pt,0,sizeof(pt));
    for(i=1;i<=l1;i++)
    {
        for(j=1;j<=l2;j++)
        {
            max=0;
            for(x=1;x<=3;x++)
            {
                if(x==1)
                {
                    if(s1[i-1]==s2[j-1])
                    {
                        val=sum[i-1][j-1]+1;
                    }else
                    {
                        val=sum[i-1][j-1];
                    }
                }else if(x==2)
                {
                    val=sum[i][j-1];
                }else
                {
                    val=sum[i-1][j];
                }
                if(val>max)
                {
                    max=val;
                    key=x;
                }
            }
            sum[i][j]=max;
            pt[i][j]=key;
        }
    }
    x=l1; y=l2;
    len=sum[l1][l2];
    len-=1;
    s3[sum[l1][l2]]='\0';
    for(i=1;i<=sum[l1][l2];i++)
    {
         while(s1[x-1]!=s2[y-1])
         {
             key=pt[x][y];
             if(key==1)
             {
                 x-=1; y-=1;
             }else if(key==2)
             {
                 y-=1;
             }else
             {
                 x-=1;
             }
         }
         s3[len]=s1[x-1];
         len-=1;
         key=pt[x][y];
         if(key==1)
         {
             x-=1; y-=1;
         }else if(key==2)
         {
             y-=1;
         }else
         {
             x-=1;
         }
    }
    strcpy(s[0],s3);
    return sum[l1][l2];
}
0 0