看了许多题解都好长啊,自不量力的来贴一下代码
(震惊于这都能ac。。。)
这道题的思路是先从字符串中找有重部分然后直接比较剩下的部分,比较的数据也可以用来计算数值
其实满水的题
总之看注释啦(竟然能耐心的写完注释...)
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<stack> 5 #include<cstring> 6 using namespace std; 7 int n,num; 8 string w[25];//记录单词 9 int use[25];//记录使用单词次数 10 int ans,now=1;//记录接龙的长度,now=1是省略了头字母 11 void dfs(int k)//深搜 12 { 13 ans=max(ans,now);//跟上个题解学的,取大 14 for(int i=1;i<=n;i++)//搜索每个单词 15 { 16 if(use[i]<2)//判断 17 { 18 for(int j=0;j<w[k].length();j++)//判断,如果首字母相同则比较 19 if(w[i][0]==w[k][j]) 20 { 21 int l1=j,l2=0; 22 while(w[i][l2]==w[k][l1]&&l1<w[k].length())l1++,l2++;//比较至词尾 23 if(l1>=w[k].length())//如果比较完成 24 { 25 now+=w[i].length()-l2;//新单词减去与上个单词重合的长度 26 use[i]++; 27 dfs(i);//以这个单词为新节点搜索 28 now-=w[i].length()-l2; 29 use[i]--; 30 } 31 } 32 } 33 } 34 } 35 int main() 36 { 37 cin>>n; 38 for(int i=1;i<=n;i++) 39 cin>>w[i]; 40 cin>>w[0];//**把头字母看做一个单词** 41 dfs(0);//**从头字母这个单词搜索** 42 cout<<ans; 43 return 0; 44 }/*我无聊呀,无聊!一袋恰恰香瓜子,我一个人嗑完了,一共1869颗,21颗是空的,混进来9颗带虫的,还有6颗没炒开,是连在一起的,还有4个是苦的。中间喝了7杯水。没错,这就是孤独。…刚才这一段话一共67个字,11个标点符号,其中8个逗号,3个句号,一共有587划,其中横78划,竖137划,撇65划,捺57划,其他139划。没错这就是闲人的最高境界难过同意的来个赞赞?(?ε`) 45 46 47 48 顺便无聊一下*/