10.25T3 时间复杂度 离线操作

#2748 时间复杂度

 

描述
20171115214240_92345
输入
20171115214250_37435
输出
20171115214259_43191
样例输入[复制]
8
2 O(1)
F i 1 1
E
2 O(n^1)
F x 1 n
E
1 O(1)
F x 1 n
4 O(n^2)
F x 5 n
F y 10 n
E
E
4 O(n^2)
F x 9 n
E
F y 2 n
E
4 O(n^1)
F x 9 n
F y n 4
E
E
4 O(1)
F y n 4
F x 9 n
E
E
4 O(n^2)
F x 1 n
F x 1 10
E
E
样例输出[复制]
Yes
Yes
ERR
Yes
No
Yes
Yes
ERR
提示

【输入输出样例 1 说明】

第一个程序 i 从 1 到 1 是常数复杂度。

第二个程序 x 从 1 到 n 是 n 的一次方的复杂度。

第三个程序有一个 F 开启循环却没有 E 结束,语法错误。

第四个程序二重循环, n 的平方的复杂度。

第五个程序两个一重循环, n 的一次方的复杂度。

第六个程序第一重循环正常,但第二重循环开始即终止(因为n远大于 100,100大于4)。

第七个程序第一重循环无法进入,故为常数复杂度。

第八个程序第二重循环中的变量 x 与第一重循环中的变量重复, 出现语法错误②,输出 ERR。

【数据规模与约定】

对于 30%的数据:不存在语法错误, 数据保证小明给出的每个程序的前 L/2 行一定 为以 F 开头的语句,第 L/2+1 行至第 L 行一定为以 E 开头的语句, L<=10,若 x、 y 均 为整数, x 一定小于 y,且只有 y 有可能为 n。

对于 50%的数据:不存在语法错误, L<=100, 且若 x、 y 均为整数, x 一定小于 y, 且只有 y 有可能为 n。

对于 70%的数据:不存在语法错误, L<=100。

对于 100%的数据: L<=100。

 

 

 

 

先读入,因为离线便于判断ERR,然后再在里面提取数字进行判断,记录不能进入循环的层数,注意要理清层数之间的加减和先后关系,(要不我就一次AC了

code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 using namespace std;
 5 int main() {
 6     int T;cin>>T;
 7     while(T--) {
 8         string temp_offline[200];
 9         int num_hang;string comple;
10         cin>>num_hang>>comple;getchar();
11         for(int i=1; i<=num_hang; i++)
12             getline(cin,temp_offline[i]);
13         if(num_hang%2==1) {cout<<"ERR"<<'\n';continue;}
14         int num_E=0,num_F=0;
15         for(int i=1; i<=num_hang; i++) {
16             if(temp_offline[i][0]=='E')num_E++;
17             else num_F++;
18         }
19         if(num_E!=num_F){cout<<"ERR"<<'\n'; continue;}        
20         char stack[200],top=0;int number_alphabet[30]={0},flag_used=0;
21         for(int i=1;i<=num_hang;i++){
22             if(temp_offline[i][0]=='E'){//////////top<0 
23                 number_alphabet[stack[top]-'a']=0;top--;
24                 if(top<0){
25                     flag_used=1;break;
26                 }
27             }
28             if(temp_offline[i][0]=='F'){
29                 if(number_alphabet[temp_offline[i][2]-'a']){
30                     flag_used=1;break;
31                 }
32                 else{
33                     number_alphabet[temp_offline[i][2]-'a']=1;
34                     stack[++top]=temp_offline[i][2];
35                 }
36             } 
37         }
38         if(flag_used){
39             cout<<"ERR"<<'\n';continue;
40         }    
41         int num_ci=0;
42         if(comple[2]=='1'){num_ci=0;}
43         else{
44             int now=4;
45             while(isdigit(comple[now])){
46                 num_ci=num_ci*10+comple[now]-'0';now++;
47             }
48         }
49         int now_ci=0,max_ci=0,depth_layer=1,which_error=0,changshu[300]={0};
50         for(int i=1;i<=num_hang;i++){
51             if(temp_offline[i][0]=='E'){
52                 depth_layer--;
53                 if(which_error<depth_layer+1&&which_error)continue;
54                 if(which_error==depth_layer+1){
55                     which_error=0;continue;
56                 }
57                 if(changshu[depth_layer+1]==1){
58                     changshu[depth_layer+1]=0;continue;
59                 }
60                 else now_ci--;
61             }
62             else{
63                 depth_layer++;if(which_error)continue;
64                 int now=4,left_n=0,right_n=0,num_left_x=0,num_right_x=0;
65                 if(temp_offline[i][now]=='n')
66                     left_n=1,now++;
67                 else{
68                     while(isdigit(temp_offline[i][now]))
69                         num_left_x=num_left_x*10+temp_offline[i][now]-'0',now++;
70                 }
71                 now++;
72                 if(temp_offline[i][now]=='n')
73                     right_n=1,now++;
74                 else{
75                     while(now<temp_offline[i].size())
76                         num_right_x=num_right_x*10+temp_offline[i][now]-'0',now++;
77                 }
78                 if(left_n==right_n){
79                     int fff=0;
80                     if(num_left_x>num_right_x){
81                         which_error=depth_layer;fff=1;continue;
82                     }
83                     if(fff)continue;
84                     changshu[depth_layer]=1;
85                 }
86                 else if(left_n==0&&right_n){
87                     now_ci++,max_ci=max(max_ci,now_ci);
88                 }
89                 else if((left_n&&right_n==0))
90                     which_error=depth_layer;
91             }
92         }
93         if(max_ci==num_ci)cout<<"Yes"<<'\n';else cout<<"No"<<'\n';
94     }
95     return 0;
96 }

over

posted @ 2018-10-25 19:45  saionjisekai  阅读(156)  评论(0编辑  收藏  举报