题目(洛谷)
用栈来大模拟......
代码写得比较杂也不一一解释了......
总之注意几种情况:
ERR的情况:1.栈都空了还在E 2.栈中出现相同字母
然后就是合法情况了:
- 常数 -> 常数 O(1),并且判断后面那个常数是否大于等于前面那个
- 常数 -> n ++O
- n->常数 O(1)且不进入循环
- n->n O(1)且进入循环
完了?
完了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <climits>
#define ll long long
#define llmax LONG_LONG_MAX
#define llmin LONG_LONG_MIN
#define readf(f) scanf("%lf",&f)
#define putY puts("Yes")
#define putN puts("No")
#define putE puts("ERR")
#define check ans=max(ans,cnt)
using namespace std;
inline void init()
{
freopen("complexity.in","r",stdin);
freopen("complexity.out","w",stdout);
}
template <class _E> inline void read(_E &e)
{
e=0;bool ck=0;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')ck=1;ch=getchar();}
while(ch>='0'&&ch<='9'){e=e*10+ch-'0';ch=getchar();}
if(ck)e=-e;
}
stack <int> s;
bool vis[30];
char o[105];
int which[105];
bool chang[105];
int t;
inline void chushi();
inline int gettmp()
{
int len=strlen(o);
int ret=0;
for (int i=4;i<len-1;++i)
ret*=10,ret+=(o[i]-'0');
return ret;
}
inline int getnum(char *p)
{
int len=strlen(p);
int ret=0;
for (int i=0;i<len;++i)
ret*=10,ret+=(p[i]-'0');
return ret;
}
int main()
{
// init();
read(t);
while (t--)
{
chushi();
int L;
read(L);
int cnt=0,tmp=0,ans=0,da=0,huan=0;
scanf("%s",o);
if (o[2]=='n') tmp=gettmp();
else tmp=0;
bool can=true,dayu=false;
while (L--)
{
char c,i,x[5],y[5];
cin>>c;
if (c=='F')
{
s.push(2);
cin>>i;
scanf("%s",x);
scanf("%s",y);
if (vis[i-'a']) can=false;
vis[i-'a']=1;
++huan;
which[huan]=i-'a';
if (dayu)
{
++da;
continue;
}
if (x[0]!='n' && y[0]=='n')
{
++cnt;
check;
}
else if ((x[0]!='n' && y[0]!='n') || (x[0]=='n' && y[0]=='n'))
{
chang[huan]=1;
int n1=getnum(x),n2=getnum(y);
if (n1>n2)
{
dayu=true;
++da;
}
else
{
check;
}
}
else if (x[0]=='n' && y[0]!='n')
{
dayu=true;
++da;
}
}
else if (c=='E')
{
if (s.empty()) can=false;
else if (s.top()==2)
{
s.pop();
if (dayu)
{
--da;
if (!da) dayu=false;
}
else if (!chang[huan]) --cnt;
chang[huan]=0;
vis[which[huan]]=0;
if (huan) --huan;
}
else can=false;
}
}
if (!s.empty() || can==false)
{
putE;
continue;
}
if (ans==tmp) putY;
else putN;
}
return 0;
}
inline void chushi()
{
while (!s.empty()) s.pop();
memset(vis,0,sizeof vis);
memset(which,0,sizeof which);
memset(chang,0,sizeof chang);
memset(o,0,sizeof o);
}
哦对了,上面这份代码并不是我考试时提交的代码。
考试时94行的代码是这样的:
else if (x[0]!='n' && y[0]!='n')
这句话就是在表明:我完全漏了n->n的情况......
但还是过了,因缺思厅。
后来思考了一下为什么会过,发现主要是ccf的数据很水......
我这么写会错的话就是在ERR上面会判断错误,如果栈中出现了两个相同字母的话。
而数据里面没有n->n还出现相同字母的情况。
于是就过了233






Comments NOTHING