P1019 单词接龙 洛谷 题解

这到题是一个题目题,有很多歧义不清的地方:
1、字符串的重叠部分只去最小的重叠。
2、字符串与自己不算包含关系例:abab可以自己做自己的龙头。
附AC代码:

#include
#include
using namespace std;

int n;
string a[23];
int flag[23]={0};
int ans=0;
int len=0;
string start;

int com(string a, string b){
	string forward;
	string backward;
	int len=0;
	for(int i=0, j=a.length()-1; i<=b.length() && j>0; i++, j--){
		string::iterator it;
		it = forward.begin();
		forward.insert(it, a[j]);
		backward += b[i];
		if(forward.compare(backward)==0){
			len = forward.length();
			return len;
		}
	}
	return len;
}

void dfs(int num, string head){

	if(num==1){
		for(int i=0; i<n; i++){
			if(a[i].find(head)==0){
				flag[i]++;
				len += a[i].length();
				dfs(num+1, a[i]);
				len -= a[i].length();
				flag[i]--;
			}
		}
	}
	else{
		for(int i=0; i<n; i++){
			int temp = com(head, a[i]);
				if(flag[i]<2 && temp!=0){
				flag[i]++;
				len = len + a[i].length()-temp;
				dfs(num+1, a[i]);
				len = len - a[i].length()+temp;
				flag[i]--;
			}
		}
	}


	ans = max(ans, len);
	return;

}


int main(){
	scanf("%d", &n);

	for(int i=0; i<n; i++){
		cin>>a[i];
	}
	cin>>start;


	dfs(1, start);
	printf("%d", ans);


}

你可能感兴趣的:(算法)