CSPS T3 RE,知道问题大概位置求调
  • 板块学术版
  • 楼主樱雪喵>w<
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/22 16:06
  • 上次更新2023/10/22 16:12:14
查看原帖
CSPS T3 RE,知道问题大概位置求调
234074
樱雪喵>w<楼主2023/10/22 16:06

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;
}
2023/10/22 16:06
加载中...