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 的沒好回憶(手寫結構體)。
把題目中給的型別遞迴建成一棵(二叉)樹,葉節點表示 double
或 int
,非葉節點表示 pair
。
透過首字母判斷當前是哪一種,如果是葉節點就設定完節點資訊直接返回;否則先找遞迴找左葉節點(first
),遞迴的同時返回子節點編號和該節點對應的字串右端點,透過左葉節點的右端點找到字串中右葉節點的起始位置,再遞迴處理尋找右子節點。
查詢就更簡單了,把字串拆解成一連串 first
和 second
,根據這個決定走左葉節點還是右葉節點。
注意儲存的時候不要在節點記憶體整個節點對應的字串,會爆空間。可以存型別編號或直接存型別名稱之類的。
#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;
}