记得return 0

输入输出

关闭同步流肯定会记得
但是要记得define endl '\n' 更重要

dfs和string传参的注意

题目链接

#include<bits/stdc++.h>
using namespace std;

//#define int long long
using ll = long long;
using ar2 = array<int,2>;
using ar3 = array<int,3>;
using pii = pair<int,int>;
#define fi first
#define se second
#define endl '\n'
const int N=20,MOD=1e9+7;
int n,m;
unordered_set<string>st;
string s[N];
bool vis[N];

bool check(string str){
	int x=str.size();
	return x>=3&&x<=16;
}

void dfs(int cnt,string now){
	if(cnt==n){
		if(now.size()>=3&&now.size()<=16&&st.count(now)==0){
			cout<<now<<endl;
			exit(0);
		}
		return;
	}

	for(int i=1;i<=n;i++){
		if(vis[i]) continue;
		vis[i]=1;
		string und="_";
		
		while(now.size()+und.size()+s[i].size()>=3&&now.size()+und.size()+s[i].size()<=16){
			dfs(cnt+1,now+und+s[i]);
			und+='_';
		}
		vis[i]=0;
	}
}

void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>s[i];
	}
	for(int i=0;i<m;i++){
		string t;cin>>t;
		st.insert(t);
	}
	
	for(int i=1;i<=n;i++){
		vis[i]=1;
		dfs(1,s[i]);
		vis[i]=0;
	}
	cout<<-1<<endl;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int T=1;
//	cin>>T;
	while(T--) solve();
	return 0;

}

重点不在题目逻辑
看check函数

bool check(string str){
	int x=str.size();
	return x>=3&&x<=16;
}

不能写bool check(string &str)
因为dfs调用时 while(check(now+und+s[i]) 传入check的string并不是一个变量 是一个临时的string没法引用
所以这样的函数不要用 传参会拷贝一份 效率变慢 会tle几个样例 只能麻烦一点每次都手写一个判断了

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐