打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
AcWing 1117. 单词接龙
userphoto

2022.11.20 北京

关注

时隔n年练习string 的自带函数,完全不记得substr了....

思路:

         首先注意重叠部分的长度使用是任意的.预处理出每个字符串之间重叠的最短长度.然后dfs相连即可.

判定前后缀是否相等用substr较为方便.主要有两种用法 Go

         因为重合部分不能超过原字符串长,所以直接对比字符串之间的重叠部分即可.

 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 using namespace std;
 5 const int N = 25;
 6 int n,cnt[N],ans,g[N][N];
 7 string s[N];
 8 void dfs(int x,int len)
 9 {
10     ans = max(ans,len);
11     for(int i=1;i<=n;i++)
12     {
13         int l1 = s[x].size(),l2 = s[i].size();
14         if(g[x][i]&&cnt[i]<2)
15         {
16             cnt[i]++;
17             dfs(i,len+l2-g[x][i]);
18             cnt[i]--;
19         }
20     }
21 }
22 void inits()
23 {
24     for(int i=1;i<=n;i++)
25       for(int j=1;j<=n;j++)
26       {
27           string a = s[i],b = s[j];
28           for(int k=1;k<min(a.size(),b.size());k++)
29               if(a.substr(a.size()-k,k)==b.substr(0,k))
30               {
31                   g[i][j] = k;
32                   break;
33               }
34       }
35 }
36 int main()
37 {
38     scanf("%d",&n);
39     char head[5];
40     for(int i=1;i<=n;i++) cin>>s[i];
41     scanf("%s",head);
42     inits();
43     for(int i=1;i<=n;i++)
44     {
45         if(s[i][0]==head[0])
46         {
47             cnt[i]++;
48             dfs(i,(int)s[i].size());
49             cnt[i]--;
50         }
51     }
52     printf("%d\n",ans);
53     return 0;
54 }

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
删除指定的字符
自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[6]倒排索引的建立的程序分析(...
C++截取字符串子串实现
NOIP2002提高组题解
242 [LeetCode] Valid Anagram 验证变位词
C++ replace() 函数用法详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服