https://www.luogu.org/problemnew/show/P3952
模拟,日常认识到自己zz。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<vector> 7 using namespace std; 8 const int maxn=110; 9 char ch[20]; 10 int n,ans,ke; 11 int f[maxn]={},x[maxn]={},l[maxn]={},r[maxn]={}; 12 int vis[maxn][30]={},fa[maxn]={},dep[maxn]={}; 13 void dfs(int num,int dui){ 14 if(num>n){if(dui)ke=1;return;} 15 if(f[num]==0){ 16 if(dui==0){ke=1;return;} 17 dfs(num+1,fa[dui]); 18 return; 19 } 20 if(vis[dui][x[num]]){ke=1;return;} 21 for(int i=1;i<=26;i++) 22 vis[num][i]=vis[dui][i]; 23 fa[num]=dui;vis[num][x[num]]=1; 24 if(l[num]<=r[num]&&!((l[num]==0)^(r[num]==0))){ 25 dep[num]=dep[dui]; 26 ans=max(ans,dep[num]); 27 dfs(num+1,num); 28 } 29 else if(r[num]==0){ 30 dep[num]=dep[dui]+1; 31 ans=max(ans,dep[num]); 32 dfs(num+1,num); 33 } 34 else{ 35 int k=num+1,z=1,du=num; 36 while(z){ 37 if(!f[k]){ 38 --z;du=fa[du]; 39 } 40 else{ 41 if(vis[du][x[k]])ke=1; 42 for(int i=1;i<=26;i++) 43 vis[k][i]=vis[du][i]; 44 fa[k]=du;vis[k][x[k]]=1;du=k; 45 ++z; 46 } 47 ++k; 48 }k--; 49 if(k<n+1){ 50 dfs(k+1,dui); 51 } 52 else{ 53 ke=1;return; 54 } 55 } 56 } 57 int main(){ 58 int T;scanf("%d",&T); 59 while(T-->0){ 60 memset(f,0,sizeof(f)); 61 memset(fa,0,sizeof(fa)); 62 memset(vis,0,sizeof(vis)); 63 memset(dep,0,sizeof(dep)); 64 scanf("%d",&n); scanf("%s",ch); int k=0; 65 if(ch[2]!=‘1‘) for(int i=4;ch[i]!=‘)‘;i++) k=k*10+ch[i]-‘0‘; 66 for(int i=1;i<=n;i++){ 67 scanf("%s",ch); 68 if(ch[0]==‘F‘){ 69 f[i]=1; 70 scanf("%s",ch); 71 x[i]=ch[0]-‘a‘+1; 72 scanf("%s",ch); l[i]=0; 73 if(ch[0]!=‘n‘){ 74 for(int j=0;ch[j]>=‘0‘&&ch[j]<=‘9‘;j++)l[i]=l[i]*10+ch[j]-‘0‘; 75 } 76 scanf("%s",ch); r[i]=0; 77 if(ch[0]!=‘n‘){ 78 for(int j=0;ch[j]>=‘0‘&&ch[j]<=‘9‘;j++)r[i]=r[i]*10+ch[j]-‘0‘; 79 } 80 }else f[i]=0; 81 } 82 ans=0;ke=0;dfs(1,0); 83 if(ke)printf("ERR\n"); 84 else if(ans==k)printf("Yes\n"); 85 else printf("No\n"); 86 } 87 return 0; 88 }