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

求助大佬,为什么会TLE啊啊啊啊啊(大悲

2023/10/28 10:34
加载中...