noip2017 时间复杂度
先吐槽
题目我就不贴了
嗯
很爆炸
当时考试的时候觉得很简单
然后就写啊写啊写
然后发现好多细节啊
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;
}