2024牛客暑期多校訓練營10 - VP記錄

Jerrycyx發表於2024-10-30

A. Surrender to My Will

直接判斷當前是否不可翻盤。

點選檢視程式碼
#include<cstdio>
using namespace std;

int main()
{
	char str[10]; scanf("%s",str);
	int y=0,n=0;
	for(int i=0;i<5;i++)
	{
		if(str[i]=='Y') y++;
		if(str[i]=='N') n++;
	}
	if(y>=4) printf("1\n");
	else if(n>=2) printf("-1\n");
	else printf("0\n");
	return 0;
}

B. std::pair

讓我想起了去年 CSP-S2023 T3 的沒好回憶(手寫結構體)。

把題目中給的型別遞迴建成一棵(二叉)樹,葉節點表示 doubleint,非葉節點表示 pair

透過首字母判斷當前是哪一種,如果是葉節點就設定完節點資訊直接返回;否則先找遞迴找左葉節點(first),遞迴的同時返回子節點編號和該節點對應的字串右端點,透過左葉節點的右端點找到字串中右葉節點的起始位置,再遞迴處理尋找右子節點。

查詢就更簡單了,把字串拆解成一連串 firstsecond,根據這個決定走左葉節點還是右葉節點。

注意儲存的時候不要在節點記憶體整個節點對應的字串,會爆空間。可以存型別編號或直接存型別名稱之類的。

#include<cstdio>
#include<map>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=1005;
int n,q;

map<string,int> raw;
struct JC_Pair{
	string name;
	int p1,p2;
}p[N*N];
int pidx=0;

string type,var;
pair<int,int> get_pair(int l) //返回 {索引,右端點}
{
	int now=++pidx;
	if(type[l]=='p') //pair<first,second>
	{
		pair<int,int> sonl=get_pair(l+5); //first
		int sonl_idx=sonl.first,mid=sonl.second;
		p[now].p1=sonl_idx;
		
		pair<int,int> sonr=get_pair(mid+2); //second
		int sonr_idx=sonr.first,end=sonr.second;
		p[now].p2=sonr_idx;
		
		p[now].name="pair";
		return {now,end+1};
	}
	
	if(type[l]=='i') //int
	{
		p[now]={"int",0,0};
		return {now,l+2};
	}
	
	if(type[l]=='d') //double
	{
		p[now]={"double",0,0};
		return {now,l+5};
	}
	
	printf("ERROR!\n");
	return {-1,-1};
}

void print_pair(int x)
{
	printf("%s",p[x].name.c_str());
	if(p[x].name=="pair")
	{
		putchar('<');
		print_pair(p[x].p1);
		putchar(',');
		print_pair(p[x].p2);
		putchar('>');
	}
	return;
}

string ts,tt;
int main()
{
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
	{
		cin>>type>>var;
		pair<int,int> tmp=get_pair(0);
		raw[var]=tmp.first;
	}
	for(int i=1;i<=q;i++)
	{
		cin>>ts;
		tt.clear();
		int pos=0; bool is_name=true;
		int now=0;
		while(pos<=(int)ts.length())
		{
			if(pos==(int)ts.length() || ts[pos]=='.')
			{
				if(is_name)
				{
					now=raw[tt+';'];
					is_name=false;
				}
				else
				{
					if(tt=="first") now=p[now].p1;
					else if(tt=="second") now=p[now].p2;
					else printf("ERROR!\n");
				}
				tt.clear();
			}
			else
			{
				tt+=ts[pos];
			}
			pos++;
		}
		print_pair(now);
		putchar('\n');
	}
	return 0;
}

相關文章