求助大佬 T了三个点
  • 板块P2830 写程序
  • 楼主LIXE_115
  • 当前回复1
  • 已保存回复2
  • 发布时间2023/10/28 13:39
  • 上次更新2023/10/28 15:41:37
查看原帖
求助大佬 T了三个点
1025479
LIXE_115楼主2023/10/28 13:39
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define re register
map<pair<string,int>,int>addr;//存储数组名称(pair.first),数组下标(pair.second),该位置的值的大小
map<string,int>siz;//存储数组的大小,防溢出
string a,b;bool conti=true;//判断是否出现不合法情况
struct anss{string name;int sizee;};//方便存储
struct for_find2{string name;int wei;};//方便存储
inline for_find2 find2(string s,int it){//给定a[0](s)与左中括号的下标(it),要找到a
    string ans;re int k;
    for(k=it;k>=0;k--){
        if(s[k]=='['||k==0){
            int Max=k+1;
            if(k==0) Max--;
            for(int i=Max;i<=it;i++){
                ans+=s[i];
            }
            break;
        }
    }
    return (for_find2){ans,k-1};
}
inline anss search(string s){//用于找到真正的地址,处理a[b[c[0]]]的情况
    int len=s.size();
    re int i;
    for(i=len-1;i>=0;i--){
        if(s[i]=='['){
            i++;break;
        }
    }
    // for(i=0;i<len;i++)
    //     if(s[i]>='0'&&s[i]<='9')break;
    int x=0;
    for(re int j=i;j<len;j++){
        if(s[j]==']'){
            i-=2;break;
        }
        x=x*10+s[j]-48;
    }
    for_find2 ty=find2(s,i);i=ty.wei;
    if(siz[ty.name]<=x){
        if(siz[ty.name]==0)
            return (anss){ty.name,x};
        cout<<-1<<endl;exit(0);
    }
    int si=addr[make_pair(ty.name,x)];
    while(i>=0){
        for_find2 tt=find2(s,i);
        i=tt.wei;
        if(siz[tt.name]<=si){
            if(siz[tt.name]==0)
                return (anss){tt.name,si};
            cout<<-1<<endl;exit(0);
        }
        if(i<0){
            return (anss){tt.name,si};
        }
        si=addr[make_pair(tt.name,si)];
    }
    return (anss){ty.name,x};
}
int main(){
    ios::sync_with_stdio(false);
    while(1){
        cin>>a>>b;
        if(a=="int"){
            anss type=search(b);
            siz[type.name]=type.sizee;
        }
        else if(a=="cout"){
            anss type=search(b);
            cout<<addr[make_pair(type.name,type.sizee)]<<endl;
        }
        else{//给数组赋值的情况
            anss type=search(a);int x=0;
            for(re int i=0;i<b.size();i++){
                x=x*10+b[i]-48;
            }
            addr[make_pair(type.name,type.sizee)]=x; 
        }
    }
    return 0;
}

rt 大悲(

2023/10/28 13:39
加载中...