题目1220单词接龙题目描述单词接龙是一个与我们经常玩的成语接龙相类似的游戏现在我们已知一组单词且给定一个开头的字母要求出以这个字母开头的最长的“龙”每个单词都最多在“龙”中出现两次在两个单词相连时其重合部分合为一部分例如beast和astonish如果接成一条龙则变为beastonish另外相邻的两部分不能存在包含关系例如at和atide间不能相连。输入输入的第一行为一个单独的整数n(n20)表示单词数以下n行每行有一个单词只含有大写或小写字母长度不超过20输入的最后一行为一个单个字符表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。输出只需输出以此字母开头的最长的“龙”的长度。时空限制1s / 64MB样例输入5 at touch cheat choose tact a样例输出23代码#includebits/stdc.husingnamespacestd;constintN2010;intn;string word[N];intg[N][N],used[N],ans;voiddfs(string a,inti){ansmax(ans,int(a.size()));used[i];for(intj0;jn;j)if(g[i][j]used[j]2)dfs(aword[j].substr(g[i][j]),j);used[i]--;}intmain(){cinn;for(inti0;in1;i)cinword[i];for(inti0;in;i)for(intj0;jn;j){string aword[i],bword[j];for(intk1;kmin(a.size(),b.size());k){//重叠部分越短越好if(a.substr(a.size()-k,k)b.substr(0,k)){g[i][j]k;break;}}}for(inti0;in;i)if(word[i][0]word[n][0])dfs(word[i],i);coutans;return0;}结果
【题解-信息学奥赛一本通】1220:单词接龙
题目1220单词接龙题目描述单词接龙是一个与我们经常玩的成语接龙相类似的游戏现在我们已知一组单词且给定一个开头的字母要求出以这个字母开头的最长的“龙”每个单词都最多在“龙”中出现两次在两个单词相连时其重合部分合为一部分例如beast和astonish如果接成一条龙则变为beastonish另外相邻的两部分不能存在包含关系例如at和atide间不能相连。输入输入的第一行为一个单独的整数n(n20)表示单词数以下n行每行有一个单词只含有大写或小写字母长度不超过20输入的最后一行为一个单个字符表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。输出只需输出以此字母开头的最长的“龙”的长度。时空限制1s / 64MB样例输入5 at touch cheat choose tact a样例输出23代码#includebits/stdc.husingnamespacestd;constintN2010;intn;string word[N];intg[N][N],used[N],ans;voiddfs(string a,inti){ansmax(ans,int(a.size()));used[i];for(intj0;jn;j)if(g[i][j]used[j]2)dfs(aword[j].substr(g[i][j]),j);used[i]--;}intmain(){cinn;for(inti0;in1;i)cinword[i];for(inti0;in;i)for(intj0;jn;j){string aword[i],bword[j];for(intk1;kmin(a.size(),b.size());k){//重叠部分越短越好if(a.substr(a.size()-k,k)b.substr(0,k)){g[i][j]k;break;}}}for(inti0;in;i)if(word[i][0]word[n][0])dfs(word[i],i);coutans;return0;}结果