题解:P6439 [COCI2011-2012#6] ZAGRADE

看到括号,想到括号匹配,可以使用栈:

for(int i = 0; i < n; i ++){
    if(s[i] == '(') st[++ head] = i;
    if(s[i] == ')') b[++ cnt] = make_pair(st[head --], i);//b用来记录每对括号的位置
}

输出所有方案可以用 dfs 枚举每一对括号是否删除:

void dfs(int k){
	if(k == cnt + 1){
		print();
		return;
	}
	a[k] = 1;//删掉
	dfs(k + 1);
	a[k] = 0;//不删
	dfs(k + 1);
}

统计答案时按字典序排序,可以用 set 排序,还能顺便去重:

void print(){
	string now = "";
	bool flag = 0;//如果全部不删,和原来相同,也不可以
	map<int, int> mp;
	for(int i = 1; i <= cnt; i ++){
		if(a[i] == 1) mp[b[i].first] = mp[b[i].second] = flag = 1;
	}
	if(!flag) return;
	for(int i = 0; i < n; i ++){
		if(!mp[i]) now += s[i];
	}
	ans.insert(now);
}

最后使用 for(auto x : ans) 语句输出即可,完整代码:

#include<bits/stdc++.h>
using namespace std;
string s;
set<string> ans;
int a[205], st[205], head, n, cnt, anscnt;
pair<int, int> b[205];
void print(){
	string now = "";
	bool flag = 0;
	map<int, int> mp;
	for(int i = 1; i <= cnt; i ++){
		if(a[i] == 1) mp[b[i].first] = mp[b[i].second] = flag = 1;
	}
	if(!flag) return;
	for(int i = 0; i < n; i ++){
		if(!mp[i]) now += s[i];
	}
	ans.insert(now);
}
void dfs(int k){
	if(k == cnt + 1){
		print();
		return;
	}
	a[k] = 1;
	dfs(k + 1);
	a[k] = 0;
	dfs(k + 1);
}
int main(){
	cin >> s; n = s.size();
	for(int i = 0; i < n; i ++){
		if(s[i] == '(') st[++ head] = i;
		if(s[i] == ')') b[++ cnt] = make_pair(st[head --], i);
	}
	dfs(1);
	for(auto x : ans){
		cout << x << "\n";
	}
	return 0;
}

最后,我们就 AC 了。

posted on   zhangzirui66  阅读(1)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示