zoukankan      html  css  js  c++  java
  • 洛谷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;
      }
    }
  • 相关阅读:
    Vue之常用语法
    Django之crm
    Django项目之客户
    前端、数据库、Django简单的练习
    Django的认证系统
    Django之form表单
    OpneCV 二值图像区域处理
    OpenCV图像处理中常用函数汇总(1)
    OpenCV3编程入门笔记(6)自我验证各函数程序代码
    OpenCV_轮廓的查找、表达、绘制、特性及匹配
  • 原文地址:https://www.cnblogs.com/ssNiper/p/11208448.html
Copyright © 2011-2022 走看看