noip2017 時間復雜度
阿新 • • 發佈:2017-11-18
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 時間復雜度