单词接龙。给你一些单词,再给你一个字符,
要求出以这个字母开头的最长的“龙”。
其中:
1.每个单词都最多在“龙”中出现两次。
2.在两个单词相连时,其重合部分合为一部分,例如 beast 和 astonish,如果接成一条龙则变为 beastonish,
3.另外相邻的两部分不能存在包含关系,例如 at 和 atide 间不能相连。
4.但是ENGLISHE和ENGLISHE可以相连。
解
预处理哪些字符串可以相连,相连后增加的长度为多少,然后DFS。
我当时不知道同个串可以自己相连,也不知道串中有大写字母…
于是超时6个点,惨烈炸成40分。(悲)
烤了半天的标,明明我的代码应该比标跑得快啊——?
结果发现只是大写字母读不进去的问题。(恼恼)
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int n, ans, f[31][31], t, b[31];
string s[31];
void cl(int x, int y){ //y接x后
string s1 = s[x];
int l1 = s1.size();
string s2 = s[y];
int l2 = s2.size();
if(x != y) if(s2.find(s1) == 0) return;
for(int i = 1; i < l1; ++i){
string ss = s1.substr(l1-i, i);
if(s2.find(ss) == 0 && l2-i != 0){
f[x][y] = l2-i;
return;
}
}
}
void dfs(int d, int len){
ans = max(len, ans);
for(int i = 1; i <= n; ++i)
if(b[i] < 2 && f[d][i] > 0){
++b[i];
dfs(i, len + f[d][i]);
--b[i];
}
}
int main(){
freopen("english.in","r",stdin);
freopen("english.out","w",stdout);
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
cin >> s[i];
for(int i = 1; i <= n; ++i){
for(int j = i+1; j <= n; ++j){
cl(i, j);
cl(j, i);
}
cl(i,i);
}
char c = getchar();
while((c > 'z' || c < 'a') && ( c>'Z' || c<'A'))
c = getchar();
for(int i = 1; i <= n; ++i)
if(s[i][0] == c){
b[i] = 1;
dfs(i, s[i].size());
b[i] = 0;
}
printf("%d", ans);
fclose(stdin);
fclose(stdout);
}