//poj 2138
//sep9
#include <iostream>
using namespace std;
const int MAXN=1024;
const int MAXL=80;
int n,ecnt;
struct edge{
char s[MAXL+4];
bool exist;
int nxt;
}first,e[MAXN+4];
int head[MAXL+4];
bool judge(int i,int j)
{
int len=strlen(e[j].s);
int state=0;
for(int p=0,q=0;q<len;){
if(state==0){
if(e[i].s[p]==e[j].s[q])
++p,++q;
else{
state=1;
++q;
}
}else if(state==1){
if(e[i].s[p]==e[j].s[q])
++p,++q;
else{
return false;
}
}
}
return true;
}
int main()
{
memset(head,-1,sizeof(head));
ecnt=0;
scanf("%d%s",&n,first.s);
int start;
for(int i=0;i<n;++i){
scanf("%s",e[ecnt].s);
int len=strlen(e[ecnt].s);
e[ecnt].nxt=head[len],e[ecnt].exist=false,head[len]=ecnt;
if(!strcmp(e[ecnt].s,first.s)) start=ecnt;
++ecnt;
}
int ans=start;
head[3]=start,e[start].exist=true,e[start].nxt=-1;
for(int len=3;len<MAXL;++len){
for(int i=head[len];i!=-1;i=e[i].nxt)
if(e[i].exist){
for(int j=head[len+1];j!=-1;j=e[j].nxt){
if(judge(i,j)){
e[j].exist=true;
ans=j;
}
}
}
}
printf("%s\n",e[ans].s);
return 0;
}
poj 2138 Travel Games 搜索+自动机水题
最新推荐文章于 2019-06-08 16:02:07 发布