CF191A
Dynasty Puzzles
题面翻译
题目描述
有一个王朝,他们国王的名字用姓氏的简写来标记每一代。为了保证王朝的稳定,现在这个王朝的继承人的名字需要满足继承者名字的第一个字母要和前代名字最后一个字母相同。然后拼接起来的名字,第一个字母和最后一个字母相同。现在有一个考古博士,知道了这个王朝国王和亲戚的名字。问你这个王朝所能够得到的最长字符串。
输入
第一行一个整数n(1≤n≤5·1e5),接下来n行,每行一个非空字符串,全由小写字母组成,字符串长度不超过10
输出
最长满足要求的长度,如果没有输出0
样例 #1
样例输入 #1
3
abc
ca
cba
样例输出 #1
6
样例 #2
样例输入 #2
4
vvp
vvp
dam
vvp
样例输出 #2
0
样例 #3
样例输入 #3
3
ab
c
def
样例输出 #3
1
f[i][j]:以字母i开头 j结尾的maxlen
转移即可
最后统计max{f[i][i]}
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,l[500005],f[27][27];//以i开头 j结尾的最大长度
string s[500005];
int main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1; i<=n; i++) {
cin>>s[i];
l[i]=s[i].length();
}
for(int i=1; i<=n; i++) {
int st=s[i][0]-'a'+1,ed=s[i][l[i]-1]-'a'+1;
for(int j=1; j<=26; j++)
if(f[j][st])
f[j][ed]=max(f[j][ed],f[j][st]+l[i]);
f[st][ed]=max(f[st][ed],l[i]);
}
int maxx=0;
for(int i=1; i<=26; i++)
maxx=max(maxx,f[i][i]);
cout<<maxx<<"\n";
return 0;
}
此生无悔入OI 来生AK IOI

浙公网安备 33010602011771号