codevs 1018 noip 2000 单词接龙
2016-11-01 10:48
288 查看
题目描述 Description
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。输入描述 Input Description
输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.输出描述 Output Description
只需输出以此字母开头的最长的“龙”的长度样例输入 Sample Input
5at
touch
cheat
choose
tact
a
样例输出 Sample Output
23数据范围及提示 Data Size & Hint
(连成的“龙”为atoucheatactactouchoose)用dfs搜索每一种接龙情况即可,记录每次增长的的长度(即新加的单词除去重叠部分的长度),最后记录总长度。注意:单词可以自己跟自己相连,比如只给出一个单词eye,那么长度为5。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,m,q,w,e,c[101]={0},ans=0,p=0; string s[1001]; char ch; void dfs(string ss,int sss) { bool v=0; ans=max(ans,sss); for(int i=1;i<=n;i++) { if(c[i]==2) continue; for(int j=0;j<ss.size();j++) { if(s[i][j]==ss[ss.size()-1]) { int tt=0; bool vv=0; for(int k=j-1;k>=0;k--) { tt++; if(s[i][k]!=ss[ss.size()-1-tt]) { vv=1; break; } } if(!vv) { c[i]++; dfs(s[i],sss+s[i].size()-j-1); c[i]--; } } } } } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>s[i]; cin>>ch; for(int i=1;i<=n;i++) { if(s[i][0]==ch) { c[i]=1; dfs(s[i],s[i].size()); c[i]=0; } } cout<<ans<<" "; return 0; }
相关文章推荐
- [CODEVS 1018] Noip 2000 单词接龙
- 【DFS】CODE[VS] 1018&&NOIP2000提高组T3 单词接龙 (日常刷题???)
- Codevs 1018 单词接龙 DFS --2000年NOIP全国联赛普及组NOIP全国联赛提高组
- codevs 1018 [noip 2000 提高] 单词接龙
- Noip2000 T3 单词接龙
- [NOIP2000]单词接龙
- Noip2000 T3 单词接龙
- 【NOIP2000】【Luogu1019】单词接龙
- NOIP2000提高组 单词接龙
- ACM [NOIP2000] 单词接龙(水DFS枚举注意尽量减小常数)
- NOIP 2000 提高组 复赛 单词接龙
- noip2000单词接龙(搜素)
- NOIP2000 单词接龙
- [NOIP提高组2000]单词接龙
- codevs1018单词接龙
- NOIP 2000 单词接龙
- 20160316 Codevs 1018 单词接龙,1166 矩阵取数(60'),1297 硬币,1009 产生数
- 洛谷 P1019 [NOIP2000 T3] 单词接龙
- wikioi 1018 单词接龙 提高组 2000
- codevs1018 单词接龙