字符串截取函数substr的用法
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<cmath>
#include<bitset>
#include<cstdio>
#include<string>
#include<vector>
#include<sstream>
#include<cstring>
#include<>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1e-8
#define endl '\n'
#define inf 0x3f3f3f3f
#define MAX 1048576
#define mod 1000000007
#define lowbit(x) (x & (-x))
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d %d",&n,&m)
#define pd(n) printf("%d\n", (n))
#define pdd(n,m) printf("%d %d\n",n, m)
#define sddd(n,m,z) scanf("%d %d %d",&n,&m,&z)
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define mem(a,b) memset((a),(b),sizeof(a))
//#define max(a,b) (((a)>(b)) ? (a):(b))
//#define min(a,b) (((a)>(b)) ? (b):(a))
typedef long long ll ;
typedef unsigned long long ull;
//不开longlong见祖宗!不看范围见祖宗!
inline int IntRead(){char ch = getchar();int s = 0, w = 1;while(ch < '0' || ch > '9'){if(ch == '-') w = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){s = s * 10 + ch - '0';ch = getchar();}return s * w;}
int n;
string str[30];
char x;
int ans;
int tr[30];
void dfs(string s, int num){
ans = max(ans, num);//更新答案
for(int i = 1; i <= n; ++i){
if(tr[i] == 2)continue;
int len1 = (int)s.size();
int len2 = (int)str[i].size();
for(int j = min(len1, len2) - 1; j >= 1; --j){
if(s.substr(len1 - j, j) == str[i].substr(0, j)){//用上一个连接成功的字符串的后缀去匹配别的字符串的前缀
++tr[i];//记录次数用
dfs(str[i], num + len2 - j);
--tr[i];
}
}
}
}
int main(){
cin>>n;
for(int i = 1; i <= n; ++i)cin>>str[i];
cin>>x;
for(int i = 1; i <= n; ++i){
if(str[i][0] == x){
mem(tr, 0);
++tr[i];
dfs(str[i], (int)str[i].size());
}
}
cout<<ans<<endl;
return 0;
}
/*
5
at
touch
cheat
choose
tact
a
*/