单词接龙(NOIP2000)学习总结
2014-02-15 19:45
225 查看
题目描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。输入格式
输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.输出格式
只需输出以此字母开头的最长的“龙”的长度样例输入
5at
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; }
相关文章推荐
- [NOIP提高组2000]单词接龙
- 【NOIP2000】单词接龙
- NOIP2000单词接龙[DFS]
- 【NOIP2000】【Luogu1019】单词接龙
- 【NOIP 2000 提高组 T3】单词接龙(dfs)
- [NOIP2000]单词接龙
- NOIP 2000单词接龙 解题报告(爆搜)
- 洛谷——P1019 单词接龙(NOIP2000 T3)
- 洛谷 P1019 [NOIP2000 T3] 单词接龙
- codevs 1018 noip 2000 单词接龙
- [NOIP2000] 提高组 洛谷P1019 单词接龙
- Noip2000 T3 单词接龙
- [CODEVS 1018] Noip 2000 单词接龙
- ACM [NOIP2000] 单词接龙(水DFS枚举注意尽量减小常数)
- NOIP2000 单词接龙
- noip2000单词接龙解题报告
- noip2000-单词接龙2008.11.5
- codevs 1018 [noip 2000 提高] 单词接龙
- Noip2000 T3 单词接龙
- 竞赛题目讲解-【NOIP2000复赛 普及组】单词接龙