LOJ P3952 时间复杂度 noip 暴力 模拟

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
");
84         else if(ans==k)printf("Yes
");
85         else printf("No
");
86     }
87     return 0;
88 }
View Code

原文地址:https://www.cnblogs.com/137shoebills/p/8677153.html