【DG特长生2015】有趣的英语角

单词接龙。给你一些单词,再给你一个字符,
要求出以这个字母开头的最长的“龙”。

其中:
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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值