题目大意:给你n个字符串,让你找出他们的最长公共子串,如果存在多条,输出字典序最小的一个,若不存在,输出“IDENTITY LOST”。
分析:感觉就是 POJ1226,POJ3080 的综合。数据量不大,暴力就可以过。我感觉这题的考察点应该是字符串的排序,在找出m个最长公共子串后输出字典序最小的一个字符串才是本题的一个坑。
至于字符串排序,可以参考一下:字符串排序详解
实现代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 205
char str[maxn*20][maxn];
char ans[maxn*20][maxn];
int len[maxn*20];
int s[maxn*20];
int pos[maxn*20];
int n,mins;
int cmp(const void *a,const void *b)
{
return strcmp((char*)a,(char*)b);
}
bool judge(int start,int end)
{
int i,j,k;
for(i=0; i<n; i++)
{
if(i==mins) continue;
for(j=0,k=start; j<len[i]&&k<=end;)
if(str[mins][k]==str[i][j])
{
k++;
j++;
}
else
{
j=j-(k-start)+1;
k=start;
}
if(k<=end) return 0;
}
return 1;
}
int main()
{
while(scanf("%d",&n)&&n)
{
int minl=maxn;
for(int i=0; i<n; i++)
{
scanf("%s",str[i]);
len[i]=strlen(str[i]);
if(minl>len[i])
{
minl=len[i];
mins=i;
}
}
int cnt=0,tmp=0;
for(int i=0; i<minl; i++)
for(int j=0; j<=i; j++)
if(judge(j,i))
{
s[cnt]=i-j+1;
pos[cnt++]=i;
tmp=max(tmp,i-j+1);
}
if(tmp==0) puts("IDENTITY LOST");
else
{
int cnts=0;
for(int i=0; i<cnt; i++)
if(s[i]==tmp)
{
int k=0;
for(int j=pos[i]-tmp+1; j<=pos[i]; j++)
ans[cnts][k++]=str[mins][j];
ans[cnts][k]='\0';
cnts++;
}
qsort(ans,cnts,sizeof(ans[0]),cmp);
printf("%s\n",ans[0]);
}
}
return 0;
}