题目数据过水!!!
查看原帖
题目数据过水!!!
691641
Grow_楼主2023/5/4 21:11

洛谷上过了,在别的网站上只有80!!!

#include<bits/stdc++.h>
#define int long long
#define N 1000000002
using namespace std;
string s;
int num[105],q[105],key[255],ans,t,cnt;
stack<char>st;
int da,n;
bool ff(string s){
    int h=0;
    for(int i=0;i<s.size();i++){
        if(s[i]=='(')h++;
        if(s[i]==')')h--;
        if(h<0)return 0;
    }
    return !h;
}
int fpow(int a,int b,int p){
    int ans=1,t=a;
    while(b){
        if(b%2)ans=(ans*t)%p;
        t=(t*t)%p;
        b/=2;
    }
    return ans;
}
int bds(string s){
    while(!st.empty())st.pop();
    memset(num,0,sizeof(num));
    memset(q,0,sizeof(q));
    ans=t=cnt=0;
    char stk[105]={},pd[105]={};
    key['+']=key['-']=1;
    key['*']=2;
    key['^']=3;
    for(int i = 1,j=0;i<=s.size();++i){
        if(s[i]>='0'&&s[i]<='9'){
            if(!j)num[++t]=s[i]-'0',j=1;
            else num[t]=num[t]*10+s[i]-'0';
        }
        else{
            j=0;
            if(s[i]=='-'&&(i==1||s[i-1]=='('))num[++t]=0;
            if(s[i]=='(')stk[++cnt]=s[i];
            else if(s[i]==')'){
                if(!cnt)continue;
                while(stk[cnt]!='(')pd[++t]=stk[cnt--];
                --cnt;
            }
            else if(cnt&&key[s[i]]<key[stk[cnt]]){
                while(cnt&&stk[cnt]!='('&&key[s[i]]<=key[stk[cnt]])pd[++t]=stk[cnt--];
                stk[++cnt]=s[i];
            }
            else if(cnt&&key[s[i]]==key[stk[cnt]]){
                    while(cnt&&key[s[i]]==key[stk[cnt]])pd[++t]=stk[cnt--];
                    stk[++cnt]=s[i];
            }
            else stk[++cnt]=s[i];
        }
    }
    while(cnt)pd[++t]=stk[cnt--];
    for(int i = 1;i<=t;++i){
        if(pd[i]=='+')q[cnt-1]=(q[cnt-1]+q[cnt])%N,--cnt;
        else if(pd[i]=='-')q[cnt-1]=((q[cnt-1]-q[cnt])%N+N)%N,--cnt;
        else if(pd[i]=='*')q[cnt-1]=(q[cnt-1]*q[cnt])%N,--cnt;
        else if(pd[i]=='^')q[cnt-1]=fpow(q[cnt-1],q[cnt],N),--cnt;
        else q[++cnt]=num[i];
    }
    return q[1];
}
string read(){
    string stk;
    char c = '0';
    while(c=='('||c==')'||c=='*'||c=='+'||c=='-'||c==' '||c=='^'||(c>='0'&&c<='9')||c=='a'){
        c=getchar();
        if(c=='a')stk=stk+"10001";
        else if(c!=' ')stk=stk+c;
    }
    stk=' '+stk;
    return stk;
}
signed main(){
    s=read();
    da=bds(s);
    cin >> n;
    read();
    for(int i = 'A';n--;i++){
        read();
        s=read();
        if(ff(s)){
            int f = bds(s);
            if(f==da)cout << char(i);
        }
    }
    return 0;
}
2023/5/4 21:11
加载中...