大体思路是用一个栈存输入语句,读到F开头的语句就压进栈里,读到E开头的就从栈顶出一个元素,用一个w记录时间复杂度,出栈时只要语句满足条件w就加1
xSy函数是用来判断一个语句中x变量是否小于y变量的,具体内容不多讲,很好实现
**********************************AC***********************************************************************************************************
每次读进一个F开头语句要进行如下操作:
1.判断w是否不为0,w不为0说明这个大循环还没结束,但是又新读进了一个F,这说明这个大循环里开启了一个新的小循环,与w之前记录的那个循环不嵌套
例如:
FFEFEE
读到第三个F时,w已经记录了上一对FE,这时w是1,但是又读入了这个F说明上一对FE已经结束了,这个时候就会拿w与max比,max存取所有这些循环中循环次数最大的那个
2.清空values
因为values记录的是上一个循环出现的变量,和这个循环没关系了,因此要清空
3.入栈
**********************************AC***********************************************************************************************************
每次读进一个E开头语句要进行如下操作:
1.判断栈是否为空,若为空说明是ERR,不为空则正常从栈中出语句
2.得到出栈的语句,判断它的变量是否在values中存在,存在则ERR,不存在则继续往下走
3.判断x是否小于y,若小于,再判断y为n,x不为n是不是真(注:x=n; x < n; x++这种循环复杂度是1,所以只有在循环出口为n,起点不为n的情况下才记录)
是真则w加1,且将变量记录到values里面。若x大于y,w清零,说明这个语句之前记录的复杂度都不算,因为这个循环都没进去
**********************************AC***********************************************************************************************************
若还是不懂,可以随意代几个规模小点的循环走一遍,应该能大体知道逻辑
#include<bits/stdc++.h> using namespace std; bool xSy(string s); int main(){ int t, l, w, max; bool flag; string giveCplx, realCplx, temp2, temp3; stack<string> s; vector<char> values; char temp[100]; cin >> t; while(t--){ cin >> l >> giveCplx; getchar(); w = 0; max = 0; flag = true; values.clear(); realCplx = ""; temp2 = temp3 = ""; while(!s.empty()) s.pop(); while(l--){ gets(temp); // cout << temp << endl; if(temp[0] == 'F'){ if(w != 0){ w += s.size(); if(w > max) max = w; w = 0; } s.push(temp); values.clear(); }else if(temp[0] == 'E'){ if(s.empty()){ flag = false; } else{ temp2 = s.top(); s.pop(); } if( find(values.begin(), values.end(), temp2[2]) != values.end() ){ flag = false; // cout << temp2[5] << endl; }else{ if( xSy(temp2) ){ if( temp2[temp2.size()-1] == 'n' && temp2[4] != 'n' ) w++; values.push_back(temp2[2]); }else{ // values.clear(); w = 0; } } } } if(w > max) max = w; if(!s.empty()) flag = false; if(flag){ if(max == 0){ realCplx += "O(1)"; }else{ realCplx += "O(n^"; while(max != 0){ temp3 += max%10 + '0'; max /= 10; } for(int i=temp3.size()-1; i>=0; i--) realCplx += temp3[i]; realCplx += ")"; } // cout << realCplx << endl; if(realCplx == giveCplx) cout << "Yes" << endl; else cout << "No" << endl; }else{ cout << "ERR" << endl; } } return 0; } bool xSy(string s){ int i, j; int a, b, c; a = b = 0; c = 1; if(s[s.size()-1] == 'n'){ return true; }else{ for(i=s.size()-1; i>=0; i--){ if(s[i] == ' ') break; a += (s[i]-'0') * c; c *= 10; } c = 1; for(j=i-1; j>=0; j--){ if(s[j] == ' ') break; if(s[j] == 'n' && s[s.size()-1] != 'n'){ return false; } b += (s[j]-'0') * c; c *= 10; } if( a < b ) return false; else return true; } }