洛谷p3952

  

大体思路是用一个栈存输入语句,读到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;
  }
}
原文地址:https://www.cnblogs.com/ssNiper/p/11208448.html