洛谷1019

我觉得读懂题吧。。。这个题用string真的方便,做了三个小时,给自己当个教训吧。

#include <bits/stdc++.h>
using namespace std;
const int maxn=30;
int vis[maxn];
int n,LEN,flag;
string str[maxn];

int isxunhuan(string temp)
{
	int len1=temp.length();
	int i,j,k;
	string temp1,temp2;
	for(i=1;i<=len1/2;i++){//每次取得长度 
		temp1=temp.substr(0,i);
		int flag=1;
		if(0==len1%i){
			for(j=2;j<=len1/i;j++){
				temp2=temp.substr((j-1)*i,i);
				if(temp2!=temp1){
					flag=0;
					break;
				}
			}
			if(1==flag) return i;//返回的是循环的长度 
		}
	}
	return -1;
}

int isok(string str1,string str2)
{
	if(str1==str2){
		int l=isxunhuan(str1);
		if(-1!=l){
			flag=1;
			return l;
		}
	}
	int len1=str1.length(),len2=str2.length();
	string temp;
	int i,j,k,t;
	if(str1==str2)	len2=len1-1;
	if(len2>len1){
		if(1==len1)  t=len1;//处理的是第一次输入头节点的情况 
		else t=len1-1;
	}
	else t=len2-1; 
	for(i=1;i<=t;i++){
		temp=str2.substr(0,i);
		if(str1.rfind(temp)==len1-i){
			return i;
		} 
	}
	return -1;
}

void dfs(int length,int cnt)//cnt表示的是上一个字符串的序号 
{	
	LEN=max(length,LEN);
	int i,j,k,len;
	for(i=1;i<=n;i++){
		if(vis[i]!=2){
			int diff=isok(str[cnt],str[i]);
			if(-1!=diff){
				flag=1;
				vis[i]++;
				len=str[i].length();
				dfs(length+len-diff,i);
				vis[i]--;
			}
		}
	}
}

int main()
{
	int i,j,k;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		cin>>str[i];
	cin>>str[0];
	dfs(1,0);
	if(0==flag) LEN=0;
	printf("%d",LEN);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41755258/article/details/84350757
今日推荐