P1019求调
  • 板块灌水区
  • 楼主tc291311
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/1/21 19:44
  • 上次更新2025/1/21 21:57:50
查看原帖
P1019求调
1340395
tc291311楼主2025/1/21 19:44

rt 样例输出是1

CODE
写了一些注释理解

#include<bits/stdc++.h>
using namespace std;
int n;
string a[25];
int vis[25];//记录次数 
int ans;
//函数功能:获取最长重叠长度 
int init(string s1,string s2){
	for(int i=1;i<min(s1.size(),s2.size());i++){
		bool flag=true;
		for(int j=0;j<n;j++){
			if(s1[s1.size()-i+j]!=s2[j])	flag=false;
			if(flag)	return i;
		}
	}
	return 0;
}
//搜索遍历 
void dfs(string s,int len){//s代表当前字符串,len代表s的长度 
	ans=max(ans,len);//更新最大值 
	for(int i=0;i<n;i++){//遍历字符串 
		if(vis[i]>=2)	continue;//如果超过两遍就跳过 
		int z=init(a[i],s);//获取重叠子串长度 
		if(z){//如果有重叠就继续搜索 
			vis[i]++;//使用次数+1 
			dfs(a[i],len+a[i].size()-z);
			vis[i]--;//回溯 
		}
	}
}
int main(){
   	cin>>n;
   	for(int i=0;i<=n;i++){
   		cin>>a[i];
	}
   	dfs(" "+a[n],1);
   	cout<<ans;
    return 0;
}
2025/1/21 19:44
加载中...