73分不知道为什么错

P3952 [NOIP2017 提高组] 时间复杂度

```cpp #include <bits/stdc++.h> using namespace std; int l; bool vis[355]; char str[105]; struct node{ char ch,st,en; int who,num,num1,num2; }; stack <node> st; void init(){ scanf("%d",&l); getchar(); scanf("%[^\n]",str); getchar(); memset(vis,false,sizeof(vis)); } bool con(char s){ return s>='0'&&s<='9'; } bool check(node s1,node s2){ if(s1.ch!=s2.ch||s1.st!=s2.st||s1.en!=s2.en) return false; if(s1.who!=s2.who||s1.num!=s2.num||s1.num1!=s2.num1||s1.num2!=s2.num2) return false; return true; } void solve(){ init(); char tmp[105]; bool tag=false; int tot=0,er=0,mul=0,tp=0; node dep; dep.ch='#'; int box[10101]={0}; while(l--){ scanf("%[^\n]",tmp); getchar(); if(tmp[0]!='E'){ int cnt=-1; node flag; flag.num1=0; flag.num2=0; for (int i=0;i<strlen(tmp);i++){ if(tmp[i]!=' '&&tmp[i]!='\n') cnt++; else continue; if(cnt==1) flag.ch=tmp[i]; if(con(tmp[i])){ flag.num++; while(con(tmp[i])){ if(cnt==2) flag.num1*=10,flag.num1+=tmp[i]-'0'; if(cnt==3) flag.num2*=10,flag.num2+=tmp[i]-'0'; i++; } continue; } if(cnt==2) flag.st=tmp[i]; if(cnt==3) flag.en=tmp[i]; } tot++; tp=max(tp,tot); if(vis[int(flag.ch)]==true&&(!tag)) tag=true,er=tot; vis[int(flag.ch)]=true; if((flag.num2!=0&&flag.st=='n')||(flag.num1!=0&&flag.num2!=0&&flag.num1>flag.num2)) dep=flag; st.push(flag); mul=0; } else{ if(st.empty()){tag=true;continue;} node nw=st.top(); st.pop(); if(check(dep,nw)){dep.ch='#';tot--;vis[int(nw.ch)]=false;continue;} if((nw.num1!=0&&nw.num2!=0&&nw.num1<=nw.num2)||(nw.st=='n'&&nw.en=='n')||dep.ch!='#'){tot--;vis[int(nw.ch)]=false;continue;} if(nw.num1!=0&&nw.en=='n') box[tot]=max(++mul,box[tot]); tot--; vis[int(nw.ch)]=false; } } if(!st.empty()){ printf("ERR\n"); while(!st.empty()) st.pop(); return; } if(tag){ printf("ERR\n"); return; } for (int i=109;i>=1;i--) box[i]=max(box[i+1],box[i]); int ans=box[1]; if(ans==0&&str[2]=='1'){ printf("Yes\n"); return; } int tim=0; for (int i=4;i<strlen(str)-1;i++){ tim*=10; tim+=str[i]-'0'; } if(tim==ans){ printf("Yes\n"); return; } printf("No\n"); return; } int main(){ int t; scanf("%d",&t); while(t--) solve(); } /* 1 18 O(n^4) F a 5 71 F b 35 n F c 90 94 F d 45 19 F e 1 n F f 86 n F g 49 n E E E E E E E F a 62 n F b 82 85 E E */ ```
by 正经的普通人 @ 2022-10-06 12:26:32


注释不用管……
by 正经的普通人 @ 2022-10-06 12:27:01


见 https://www.luogu.com.cn/discuss/606800
by Zzzcr @ 2023-05-11 21:32:03


|