pku 3080 Blue Jeans(暴力枚举就过)

方法1,KMP 16MS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 62
#define MAXM 12
char ans[MAXN],shot[MAXN],in[MAXM][MAXN];
int nextval[MAXN];
void getNextval(char *pat)
{
    int len=strlen(pat),j=0,k=-1;
    nextval[0]=-1;
    while(j<len)
    {
        if(k==-1 || pat[j]==pat[k])
        {
            ++j;
            ++k;
            //   next[j]=k;
            if(pat[j]==pat[k]) nextval[j]=nextval[ nextval[k] ];
            else nextval[j]=k;
        }
        else k=nextval[k];
    }
}
bool kmp(char *s,char *pat)
{
    // printf("s=%s  pat=%s\n",s,pat);system("pause");
    getNextval(pat);
    int slen=strlen(s),plen=strlen(pat),i=0,j=0;
    while(i<slen && j<plen)
    {
        if(j==-1 || s[i]==pat[j])
        {
            ++i;
            ++j;
        }
        else j=nextval[j];
    }
    if(j<plen) return false;
    else return true;
}
void solve(char *stry,int n)
{
//   printf("stry=%s\n",stry);system("pause");
    int i;
    for(i=1; i<n; i++)
    {
        if(!kmp(in[i],stry)) return;
    }
    //  printf("-------------------------------YEs\n");
    //  printf("stry=%s\n",stry);system("pause");
    int t1=strlen(stry),t2=strlen(ans);
    if( t1 > t2 ) strcpy(ans,stry);
    else if( t1 == t2 && strcmp(stry,ans) < 0 )
        strcpy(ans,stry);
}
int main()
{
    int T,i,j,k,g,n,len0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(i=0; i<n; i++)
        {
            scanf("%s",in[i]);
        }
        len0=strlen(in[0]);
        ans[0]=0;
        for(i=0; i<len0; i++)
        {
            for(j=i; j<len0; j++)
            {
                if(j-i+1<3) continue;
                g=0;
                for(k=i; k<=j; k++)
                    shot[g++]=in[0][k];
                shot[g]=0;
                solve(shot,n);
                //   printf("%s\n",shot);system("pause");
            }
        }
        if( strlen(ans) == 0 ) printf("no significant commonalities\n");
        else printf("%s\n",ans);
    }
    return 0;
}

//*************************************************************************

方法2 strstr函数,16MS
#include <stdio.h>
#include <string.h>
#define MAXN 62
#define MAXM 12
char ans[MAXN],shot[MAXN],in[MAXM][MAXN];
inline void solve(char *stry,int n)
{
    int i;
    for(i=1; i<n; i++)
    {
        if(!strstr(in[i],stry)) return;
    }
    int t1=strlen(stry),t2=strlen(ans);
    if( t1 > t2 ) strcpy(ans,stry);
    else if( t1 == t2 && strcmp(stry,ans) < 0 )
        strcpy(ans,stry);
}
int main()
{
    int T,i,j,k,g,n,len0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(i=0; i<n; i++)
        {
            scanf("%s",in[i]);
        }
        len0=strlen(in[0]);
        ans[0]=0;
        for(i=0; i<len0; i++)
        {
            for(j=i; j<len0; j++)
            {
                if(j-i+1<3) continue;
                g=0;
                for(k=i; k<=j; k++)
                    shot[g++]=in[0][k];
                shot[g]=0;
                solve(shot,n);
            }
        }
        if( strlen(ans) == 0 ) printf("no significant commonalities\n");
        else printf("%s\n",ans);
    }
    return 0;
}

 

posted @ 2010-08-28 16:19  菜到不得鸟  阅读(207)  评论(0)    收藏  举报