1

root 站长 2023-08-03 18:57:21 0
#pragma GCC optimize(2,3,"Ofast")
#include<bits/stdc++.h>
using namespace std;

stack<string> a, b;
string t[1010];
int len = 0, lenb;
void dfs(int root)
{
	if (root > lenb) return;
	//左根右
	dfs(2*root);
	t[root] = b.top();
	b.pop(); 
	len++;
	dfs(2*root+1);
}
signed main()
{
	string s;
	getline(cin, s); //读取一行
	s += ' ';
	for (int i = 0, j = 0; s[i]; i ++ )
	{
		if (s[i] == ' ')
		{
			string d =  s.substr(j, i-j);	
			j = i + 1;
			if (d == "&" || d == "|" || d == "!") 
			{
				if (a.size() >= 2) b.push(a.top()), a.pop();
				b.push(d);
				b.push(a.top()), a.pop();	
			}
			else 
			{
				a.push(d);
			}
		}
	}
	
	//build_tree 树
	lenb = b.size();
	dfs(1);
	
	for (int i = 1; i <= len; i ++ )
		cout << t[i] << endl;
    return 0;
}
{{ vote && vote.total.up }}

共 12 条回复

DKX
#include<bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int MAXN=2e5+5;
const int MOD=1e9+7;
int n,len,sum,a[MAXN];
vector<int> v[MAXN];
signed main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	} 
	stable_sort(a,a+n);
	for(int i=0;i<(1<<n);i++){
		for(int j=0;j<n;j++){
			if(i&(1<<j)){
				v[len].pb(a[j]);
			}
		}
		len++;
	}
	for(auto x:v){
		if(x.size()==3){
			int tmp=0;
			for(auto y:x){
				tmp^=y;
			}
			sum=(sum+tmp)%MOD;
		}
	} 
	cout<<sum%MOD;
	return 0;
}
DKX
#include<bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int MAXN=1e2;
int n,len,sum,a[MAXN];
vector<int> v[MAXN];
signed main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	} 
	stable_sort(a,a+n);
	for(int i=0;i<(1<<n);i++){
		for(int j=0;j<n;j++){
			if(i&(1<<j)){
				v[len].pb(a[j]);
			}
		}
		len++;
	}
	for(auto x:v){
		if(x.size()==3){
			int tmp=0;
			for(auto y:x){
				tmp^=y;
			}
			sum+=tmp;
		}
	} 
	cout<<sum;
	return 0;
}
root 站长

image.png

root 站长

image.png

DKX
#include<bits/stdc++.h>
#define MAXN 1005
using namespace std;
int n,m,len,cnt;
bool flag;
string TenToTwo(int x){
	int a[MAXN]={},i=0,j=0;
	do{
		a[++i]=x%2;
		x/=2;
	}while(x!=0);
	string ans={};
	for(j=i;j>=1;j--)	ans+=a[j]+'0';
	return ans;
} 
signed main(){
	cin>>n>>m;
	string x=TenToTwo(n),y=TenToTwo(m),ans;
	int i=x.size(),j=y.size();
	i--,j--;
	while(i>=0&&j>=0){
		len++;
		if(x[i]==y[j]&&x[i]=='1')	ans+=len+'0',ans+=' ',flag=1,cnt++;
		i--,j--;
	}
	if(flag&&cnt>=2)	cout<<ans<<'\n',puts("Open");
	else{
		if(!flag)	puts("0");
		puts("Close");
	}
	return 0;
}

root 站长
问题 G: 密室寻宝(find)
时间限制: 1 Sec 内存限制: 128 MB
提交: 24 解决: 24
[提交] [讨论版]
题目描述
哈利・波特不经意间进入了一座古墓,古墓入口有一道大门,内部有六个密室,每个密室中藏有一件兵器。已知需要两个密码才能从里面打开密室和大门,取出密室内的兵器后从大门撤出。
两个密码均是不大于63的十进制整数,将其转化为八位二进制数后对应位进行“与”运算(运算的规则是:当两个位均为“1”时,结果为“1”,否则结果为“0”)。将“与”运算的结果从右往左数,当第n位为1时,表示可以打开第n个密室,取出其中的兵器;只有当取到至少两件兵器时,方可打开大门撤出。
现在哈利・波特任意给你两个密码,请你帮他设计一个程序,算算可以从哪些密室取出兵器,并可否从大门撤出。
输入
第1行输入第一个密码P;
第2行输入第二个密码Q。
输出
第1行:按从小到大的顺序输出可以打开密室的编号。若没有可以打开的密室,则输出“0”;
第2行:若可打开大门,则输出为“Open”,否则输出“Close”。
样例输入 Copy
2
5
样例输出 Copy
0
Close
提示
输入样例2:
3
7
输出样例2:
1 2
Open
DKX

root 站长

image.png

root 站长