记录编号 310969 评测结果 AAAAAAAAA
题目名称 [NOIP 2000PJ]单词接龙 最终得分 100
用户昵称 Gravatar核糖核酸 是否通过 通过
代码语言 C++ 运行时间 0.016 s
提交时间 2016-09-23 19:37:45 内存使用 0.26 MiB
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
int n, ans;
char s[25][50];
int link[25][25];
int use[25];

void Input() {
	scanf("%d", &n);
	for(int i=1; i<=n; i++) scanf("%s", s[i]);
	scanf("%s", s[0]);
}

void Build_link() {
	memset(link, -1, sizeof(link));
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++) {
			int l1=strlen(s[i]), l2=strlen(s[j]);
			for(int k=1; k<l1; k++) {
				if(k >= l2) break;
				bool flag = true;
				for(int o=0,l=l1-k; l<l1; l++,o++)
					if(s[i][l] != s[j][o]) {
						flag = false;
						break;
					}
				if(flag == true) {
					link[i][j] = l1 + l2 - k;
					break;
				}
			}
		}
}

void DFS(int p, int len) {
	ans = max(ans, len);
	for(int j=1; j<=n; j++)
		if(link[p][j]>0 && use[j]<2) {
			use[j]++;
			DFS(j, len+link[p][j]-strlen(s[p]));
			use[j]--;
		}
}

void Solve() {
	ans = 0;
	for(int i=1; i<=n; i++) use[i] = 0;
	for(int i=1; i<=n; i++)
		if(s[i][0] == s[0][0]) {
			use[i]++;
			DFS(i, strlen(s[i]));
			use[i]--;
		}
	printf("%d", ans);
}

int main () {
	freopen("dcjl.in","r",stdin);
	freopen("dcjl.out","w",stdout);
	
	Input();
	Build_link();
	Solve();
	
	fclose(stdin); fclose(stdout);
	return 0;
}