RT,多地自测均 RE,经过查错发现是因为 main 函数中操作 3 的 assert(flag) Assertion failed。
但是完全不理解为什么匹配类型名这一步会出问题,求一份数据 / 可能的错误原因。感谢大佬 /kel
#include<bits/stdc++.h>
#define il inline
using namespace std;
#define int long long
il int read()
{
int xr=0,F=1; char cr;
while(cr=getchar(),cr<'0'||cr>'9') if(cr=='-') F=-1;
while(cr>='0'&&cr<='9')
xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
return xr*F;
}
const int N=210;
int Q,lst;
struct Type
{
string nm[N];
int sum,n,tp[N],st[N],mx;
}tp[N];
struct Bianl
{
int tp,st;
string nm;
}bl[N];
map<string,int> tpname,blname;
int tottp=4,totbl;
il void init()
{
tpname["byte"]=1,tpname["short"]=2,tpname["int"]=3,tpname["long"]=4;
tp[1].sum=1,tp[2].sum=2,tp[3].sum=4,tp[4].sum=8;
for(int i=1;i<=4;i++) tp[i].n=1,tp[i].st[1]=0,tp[i].mx=tp[i].sum;
}
il void addtp()
{
string name; cin>>name;
tottp++;
tpname[name]=tottp; int id=tottp;
tp[id].n=read();
for(int i=1;i<=tp[id].n;i++)
{
string type; cin>>type;
cin>>tp[id].nm[i];
int x=tpname[type];
tp[id].tp[i]=x; int siz=tp[x].sum;
tp[id].mx=max(tp[id].mx,tp[x].mx);
if(i==1) {tp[id].st[i]=0;continue;}
tp[id].st[i]=tp[id].st[i-1]+tp[tp[id].tp[i-1]].sum;
while(tp[id].st[i]%tp[x].mx) tp[id].st[i]++;
tp[id].sum=tp[id].st[i]+siz;
}
}
il void addbl()
{
string type,name;
cin>>type>>name;
blname[name]=++totbl; int nm=totbl;
bl[nm].nm=name;
int mn=tp[tpname[type]].mx;
while(lst%mn) lst++;
bl[nm].st=lst,bl[nm].tp=tpname[type];
lst+=tp[tpname[type]].sum;
}
il int ask(string s,int id,int pos)//查询的串,当前类型 id,当前位置
{
int x=-1;
for(int i=0;i<s.size();i++) if(s[i]=='.') {x=i;break;}
if(x==-1) return pos;
string t;
for(int i=0;i<x;i++) t+=s[i];
int y=s.size();
for(int i=x+1;i<s.size();i++) if(s[i]=='.') {y=i;break;}
string nxt; t="";
for(int i=x+1;i<y;i++) nxt+=s[i];
for(int i=x+1;i<s.size();i++) t+=s[i];
int nid=tpname[nxt];
for(int i=1;i<=tp[id].n;i++)
{
if(nxt==tp[id].nm[i]) return ask(t,tp[id].tp[i],pos+tp[id].st[i]);
}
assert(false);return 0;
}
string ans;
il void find(int id,int pos,int x)
{
if(id<=4)
{
if(tp[id].sum+pos-1<x) ans="ERR";
return;
}
int fd=tp[id].n;
for(int i=1;i<=tp[id].n;i++)
{
if(tp[id].st[i]+pos>x) {fd=i-1;break;}
}
ans+='.',ans+=tp[id].nm[fd];
find(tp[id].tp[fd],pos+tp[id].st[fd],x);
}
signed main()
{
// freopen("struct.in","r",stdin);
// freopen("struct.out","w",stdout);
Q=read();
init();
for(int i=1;i<=Q;i++)
{
int op=read();
if(op==1)
{
addtp();
int &qwq=tp[tottp].sum;
while(qwq%tp[tottp].mx) qwq++;
printf("%lld %lld\n",qwq,tp[tottp].mx);
}
else if(op==2)
{
addbl();
printf("%lld\n",bl[totbl].st);
}
else if(op==3)
{
string s; cin>>s;
int x=s.size();
for(int i=0;i<s.size();i++) if(s[i]=='.') {x=i;break;}
if(x==s.size()) // 特判基本类型变量
{
cout<<bl[blname[s]].st<<"\n";
continue;
}
string t,nxt,tt;
for(int i=0;i<x;i++) t+=s[i];
int y=s.size();
for(int i=x+1;i<s.size();i++) if(s[i]=='.') y=i;
for(int i=x+1;i<y;i++) tt+=s[i];
for(int i=x+1;i<s.size();i++) nxt+=s[i];
int id=bl[blname[t]].tp; //当前变量类型编号
bool flag=0;
for(int i=1;i<=tp[id].n;i++) //匹配下一个类型的对应名字
{
if(tp[id].nm[i]==tt)
{
flag=1;
int res=ask(nxt,tp[id].tp[i],bl[blname[t]].st+tp[id].st[i]);
cout<<res<<"\n";
break;
}
}
assert(flag); //here RE,但是没想明白为什么。
}
else
{
ans="";
int x=read();
for(int i=1;i<=totbl;i++) if(bl[i].st<=x&&(i==totbl||bl[i+1].st>x))
{
ans+=bl[i].nm;
find(bl[i].tp,bl[i].st,x);
}
if(ans=="") ans="ERR";
cout<<ans<<"\n";
}
}
return 0;
}