
https://www.luogu.org/problemnew/show/P3952
模拟,日常认识到自己zz。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
const int maxn=;
char ch[];
int n,ans,ke;
int f[maxn]={},x[maxn]={},l[maxn]={},r[maxn]={};
int vis[maxn][]={},fa[maxn]={},dep[maxn]={};
void dfs(int num,int dui){
if(num>n){if(dui)ke=;return;}
if(f[num]==){
if(dui==){ke=;return;}
dfs(num+,fa[dui]);
return;
}
if(vis[dui][x[num]]){ke=;return;}
for(int i=;i<=;i++)
vis[num][i]=vis[dui][i];
fa[num]=dui;vis[num][x[num]]=;
if(l[num]<=r[num]&&!((l[num]==)^(r[num]==))){
dep[num]=dep[dui];
ans=max(ans,dep[num]);
dfs(num+,num);
}
else if(r[num]==){
dep[num]=dep[dui]+;
ans=max(ans,dep[num]);
dfs(num+,num);
}
else{
int k=num+,z=,du=num;
while(z){
if(!f[k]){
--z;du=fa[du];
}
else{
if(vis[du][x[k]])ke=;
for(int i=;i<=;i++)
vis[k][i]=vis[du][i];
fa[k]=du;vis[k][x[k]]=;du=k;
++z;
}
++k;
}k--;
if(k<n+){
dfs(k+,dui);
}
else{
ke=;return;
}
}
}
int main(){
int T;scanf("%d",&T);
while(T-->){
memset(f,,sizeof(f));
memset(fa,,sizeof(fa));
memset(vis,,sizeof(vis));
memset(dep,,sizeof(dep));
scanf("%d",&n); scanf("%s",ch); int k=;
if(ch[]!='') for(int i=;ch[i]!=')';i++) k=k*+ch[i]-'';
for(int i=;i<=n;i++){
scanf("%s",ch);
if(ch[]=='F'){
f[i]=;
scanf("%s",ch);
x[i]=ch[]-'a'+;
scanf("%s",ch); l[i]=;
if(ch[]!='n'){
for(int j=;ch[j]>=''&&ch[j]<='';j++)l[i]=l[i]*+ch[j]-'';
}
scanf("%s",ch); r[i]=;
if(ch[]!='n'){
for(int j=;ch[j]>=''&&ch[j]<='';j++)r[i]=r[i]*+ch[j]-'';
}
}else f[i]=;
}
ans=;ke=;dfs(,);
if(ke)printf("ERR\n");
else if(ans==k)printf("Yes\n");
else printf("No\n");
}
return ;
}