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;
}
浙公网安备 33010602011771号