RE求条,RP++
查看原帖
RE求条,RP++
1095979
HSC307楼主2024/11/29 21:35

rt,在嗯偶挨批厄林厄肆前一天晚上突然发电写模拟,以RE告终,虽 bingfsbingfs ,仍不知其缘由,遂发帖求助。

提交记录

代码(猎奇码风致歉)↓

#include<bits/stdc++.h>
#define Flandre std
using namespace Flandre;
typedef long long ll;
bitset<49> WARNING1[55];
queue<int> WARNING2;

inline vector<string> split(const string &org){
    vector<string> res;
    string tmp = "";
    for(int i=0;i<org.length();++i){
        if(org[i]==' '){
            if(!tmp.empty())res.push_back(tmp);
            tmp = "";
        }else tmp+=org[i];
    }if(!tmp.empty())res.push_back(tmp);
    return res;
}

inline bool startWith(const string &org,const string &pre){
    if(org.length()<pre.length())
        return 0;
    for(int i=0;i<pre.length();++i){
        if(pre[i]==org[i])continue;
        if(pre[i]==org[i]-'a'+'A')continue;
        if(pre[i]==org[i]-'A'+'a')continue;
        return 0;
    }return 1;
}

inline bool isNum(const string &org){
    for(auto chr:org)
        if((!('0'<=chr&&chr<='9'))&&(chr!='-'))return 0;
    return 1;
}
inline bool isOper(const string &org){
    for(auto chr:org){
        if(chr=='=')continue;
        if(chr=='>')continue;
        if(chr=='<')continue;
        if(chr=='+')continue;
        if(chr=='-')continue;
        if(chr=='*')continue;
        if(chr=='/')continue;
        return 0;
    }return 1;
}

int LINE,N;
unordered_map<int,int> ENDIF;
int stacIF[495],top=-1;
bitset<49> globalVari;
inline void preIF(vector<string> *codes){
    for(LINE=2;LINE<=N;LINE++){
        if(startWith(codes[LINE][0],"IF"))
            stacIF[++top]=LINE;
        if(startWith(codes[LINE][0],"END"))
            if(top>-1)
                ENDIF[stacIF[top]]=LINE,top--;
    }
}

bool globalUnreachable = 0;
inline void runIF(vector<string> *codes,const int &IF,const int &END,bitset<49> &upVari){
    bitset<49> ifVari = upVari;
    bitset<49> elseVari = upVari;
    bitset<49> *localVari = &ifVari;
    for(int i=1;i<codes[IF].size();i++){
        if(startWith(codes[IF][i],"THEN"))break;
        if(isOper(codes[IF][i]))continue;
        if(isNum(codes[IF][i]))continue;
        if(!(*localVari)[codes[LINE][i][0]-'A'])
            WARNING1[IF].set(codes[IF][i][0]-'A');
    }
    bool unreachable = 0;
    bool retInElse = 0;
    bool retInIf = 0;
    bool inElse = 0;
    for(LINE=IF+1;LINE<END;LINE++){
        if(startWith(codes[LINE][0],"IF")){
            runIF(codes,LINE,ENDIF[LINE],*localVari);
            continue;
        }
        if(startWith(codes[LINE][0],"END"))
            continue;
        if(startWith(codes[LINE][0],"ELSE")){
            unreachable = 0;
            inElse = 1;
            localVari = &elseVari;
            continue;
        }
        if(unreachable){
            WARNING2.push(LINE);
            continue;
        }
        if(startWith(codes[LINE][0],"RETURN")){
            if(codes[LINE].size()==2){
                if(!(*localVari)[codes[LINE][1][0]-'A'])
                    WARNING1[LINE].set(codes[LINE][1][0]-'A');
            }
            unreachable = 1;
            if(inElse)
                retInElse = 1;
            else 
                retInIf = 1;
            continue;
        }
        for(int i=1;i<codes[LINE].size();i++){
            if(isOper(codes[LINE][i]))continue;
            if(isNum(codes[LINE][i]))continue;
            if(!(*localVari)[codes[LINE][i][0]-'A'])
                WARNING1[LINE].set(codes[LINE][i][0]-'A');
        }
        (*localVari).set(codes[LINE][0][0]-'A');
    }
    if(retInIf&&retInElse)globalUnreachable = 1;
    for(int i=0;i<26;i++)
        if((ifVari[i]||retInIf)&&(elseVari[i]||retInElse)&&(!upVari[i]))
            upVari.set(i);
}


inline void param(vector<string> &code){
    for(int i=1;i<code.size();i++)
        globalVari.set(code[i][0]-'A');
}


vector<string> codes[55];
inline void compile(){
    param(codes[1]);
    preIF(codes);
    for(LINE=2;LINE<=N;LINE++){
        if(startWith(codes[LINE][0],"IF")){
            runIF(codes,LINE,ENDIF[LINE],globalVari);
            continue;
        }if(startWith(codes[LINE][0],"END"))
            continue;
        if(globalUnreachable){
            WARNING2.push(LINE);
            continue;
        }
        if(startWith(codes[LINE][0],"RETURN")){
            if(codes[LINE].size()==2){
                if(!globalVari[codes[LINE][1][0]-'A'])
                    WARNING1[LINE].set(codes[LINE][1][0]-'A');
            }
            globalUnreachable = 1;
            continue;
        }
        for(int i=1;i<codes[LINE].size();i++){
            if(isOper(codes[LINE][i]))continue;
            if(isNum(codes[LINE][i]))continue;
            if(!globalVari[codes[LINE][i][0]-'A'])
                WARNING1[LINE].set(codes[LINE][i][0]-'A');
        }
        globalVari.set(codes[LINE][0][0]-'A');
    }
}
inline void warning(){
    for(LINE=2;LINE<=N;LINE++){
        if((!WARNING2.empty())&&WARNING2.front()==LINE){
            cout<<"Line "<<LINE<<": unreachable code\n";
            WARNING2.pop();
            continue;
        }
        if(!WARNING1[LINE].count())continue;
        for(int i=0;i<26;i++)
            if(WARNING1[LINE][i])
                cout<<"Line "<<LINE<<": variable "<<(char)(i+'A')<<" might not have been initialized\n";
    }
}

string input;
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    while(getline(cin,input))codes[++N] = split(input);
    compile();
    warning();
    return 0;
}

祝各位选手 RP++RP++

2024/11/29 21:35
加载中...