您的位置:首页 > 其它

单词接龙(NOIP2000)学习总结

2014-02-15 19:45 225 查看

题目描述

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。

输入格式

输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

输出格式

只需输出以此字母开头的最长的“龙”的长度

样例输入

5
at
touch
cheat
choose
tact
a

样例输出

23

//注释:连成的“龙”为atoucheatactactouchoose

#include<iostream>
#include<cstring>
#include<cstdio>
usingnamespacestd;
constintmaxn=1000;
charstr[maxn][maxn];
intmark[maxn]={0};
charch,sumch[maxn];
intn;
intmax1;
voidshow(intlen){
max1=len;//曲最长长度
}
intcheck(charch1[]){//核对是否符合龙
intlen_ch1=strlen(ch1);
intlen_sumch=strlen(sumch);
inti;
for(i=len_sumch-1;i>=0;i--){
if(sumch[i]==ch1[0])break;
}
intpos=0;
for(intj=i;j<len_sumch;j++){
if(sumch[j]!=ch1[pos++])return0;
}
if(pos==len_ch1)return0;
elsereturni;
}
voidsearch(){
for(inti=0;i<n;i++){
if(mark[i]<2){//次数是否出现过两次
intcheck_pos=check(str[i]);
if(check_pos){
intlen=strlen(sumch);
intpos=0;
for(intj=len-check_pos;j<strlen(str[i]);j++){
sumch[len+pos]=str[i][j];
pos++;
}
if(max1<strlen(sumch))show(strlen(sumch));
mark[i]++;
search();
mark[i]--;//回溯
for(intj=len;j<len+pos;j++)sumch[j]='\0';
}
}
}
}
intmain(){
cin>>n;
cin.get();
for(inti=0;i<n;i++){
gets(str[i]);
}
cin>>ch;
max1=0;
for(inti=0;i<n;i++){
memset(sumch,sizeof(sumch),'\0');
memset(mark,sizeof(mark),0);
if(str[i][0]==ch){
strcat(sumch,str[i]);
mark[i]++;
search();
}
}
cout<<max1<<endl;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: