ACM 训练日志记录 · 思考 · 成长 提交 / 修改记录
廖夏 / 题目列表训练档案
导出

P1019 [NOIP 2000 提高组] 单词接龙(疑似错题)

来源:洛谷 ★ 1300

本题活力0.30本次有不同于此前记录的心得,计入额外复盘活力

算法如山行则将至

题目描述

以指定字母开头,用单词拼接最长龙,每个单词最多用两次,相邻不能有包含关系。

代码

#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 25;
string words[MAXN];
string head;
int n, ans;
int used[MAXN];
int link(string now, string wd){
	for (int i = 1; i < min(now.length(), wd.length()); i++){
		bool flag = true;
		for (int j = 0; j < i; j++){
			if (now[now.length()-i+j] != wd[j]) flag = false;
		}
		if (flag) return i;
	}
	return 0;
}
void dfs(string now, int len){
//	cout << now << " " << len << endl;
	ans = max(ans, len);
	for (int i = 1; i <= n; i++){
		if (used[i] < 2){
			int lk = link(now, words[i]);
			if (lk){
				used[i]++;
				dfs(words[i], len + words[i].length() - lk);
				used[i]--;
			}
		}
	}
}
int main(){
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> words[i];
	cin >> head;
	dfs(" " + head, head.length());
	cout << ans;
	return 0;
}