1. 程式人生 > >noip2017 時間復雜度

noip2017 時間復雜度

iostream 爆炸 gist 答案 () reg can memset sss

先吐槽

題目我就不貼了

很爆炸
~當時考試的時候覺得很簡單~
然後就寫啊寫啊寫
然後發現好多細節啊
emmm
然後 調大樣例還是調了很久....然後就
哇 終於調過了!!!!!
一直覺得過了一個很強的樣例 心裏很安心

我tm len=strlen(s) 寫成了 len-strlen(s) 都tm可以過樣例
這就是菜過分的下場

Solution

學長是用函數遞歸寫的 我覺得棧好寫 就用棧了
無非麻煩一點就是 記錄那個非法循環的時候 需要一點點小技巧
當存在非法循環 不更新答案

當然我代碼還是很醜

#include <cstring>
#include <algorithm> #include <cmath> #include <cstring> #include <iostream> #include <cstdio> #include <stack> #define maxn 2010 #define re register using namespace std; char ch[1010]; int ace,cnt,ans,tot; bool err=false,instack[30]; stack<int>s,ss,sss; inline
int get_ace(){ scanf("%s",ch+1); int st=3,rtn=0; if(isdigit(ch[st]))return 0; else st=5; while(isdigit(ch[st]))rtn=rtn*10+ch[st]-'0',st++; return rtn; } inline int get_letter(){ scanf("%s",ch+1); return ch[1]-'a'; } inline int get_num(char
*s){ int st=1,rtn=0; while(isdigit(s[st]))rtn=rtn*10+s[st]-'0',st++; return rtn; } inline bool push_stack(){ bool fail=false,isnum1=true,isnum2=true; int cur=get_letter(),num1,num2; if(instack[cur])fail=true; scanf("%s",ch+1); if(!isdigit(ch[1]))isnum1=false; if(isnum1)num1=get_num(ch); scanf("%s",ch+1); if(!isdigit(ch[1]))isnum2=false; if(isnum2)num2=get_num(ch); if(fail)return false; if((!isnum1&&isnum2)||((isnum1&&isnum2)&&(num1>num2))){ s.push(cur); instack[cur]=true; ss.push(cnt); sss.push(-1); tot++; } if((isnum1&&isnum2)&&num1<=num2||(!isnum1&&!isnum2)){ s.push(cur); instack[cur]=true; ss.push(cnt); sss.push(0); } if(isnum1&&!isnum2){ s.push(cur); instack[cur]=true; ss.push(++cnt); sss.push(1); } return true; } inline bool pop_stack(){ if(!s.size())return false; int cur=s.top();s.pop(); instack[cur]=false; int pre_ans=ss.top();ss.pop(); int flag=sss.top();sss.pop(); if(flag==-1)tot--; else if(tot==0&&flag==0)ans=max(ans,pre_ans); else if(tot==0&&flag==1)ans=max(ans,pre_ans),cnt--; else if(flag==1)cnt--; return true; } inline void pre_pare(){ err=false; memset(instack,false,sizeof(instack)); ans=cnt=tot=0; while(s.size())s.pop(); while(ss.size())ss.pop(); while(sss.size())sss.pop(); } int main(){ freopen("in.txt","r",stdin); int T;scanf("%d",&T); while(T--){ int n;scanf("%d",&n); ace=get_ace(); pre_pare(); for(int i=1;i<=n;i++){ scanf("%s",ch+1); if(ch[1]=='F'){ bool ok=push_stack(); if(!ok)err=true; } else if(ch[1]=='E'){ bool ok=pop_stack(); if(!ok)err=true; } } if(s.size())err=true; if(err)printf("ERR\n"); else if(ace==ans)printf("Yes\n"); else printf("No\n"); } return 0; }

noip2017 時間復雜度