Блог пользователя Xorand

Автор Xorand, 15 лет назад, По-русски

Превышен предел времени на тесте 10. Не понимаю, что я делаю не так. Неужели есть более простое и быстрое решение? HELP! HELP! HELP! Подкиньте идею)


#include <iostream>
#include <string>

using namespace std;

long Seq(string s)
{
   long seq=0;
   long i=0;
   i=s.find("()");
   while (i<s.length()-1)
   {  
      for (long j=i;j<s.length()-2;j++)
      {
        s[j]=s[j+2];
      }  
    s.resize(s.length()-2);
    seq+=2;  
    i=s.find("()");
   }
   if (s.length()>0)
   {
      seq=0;
   }
   return seq;
}
void main()
{
   string cmd;
   cin>>cmd;
   long maxl = 0, num = 0;
   for (long i = 0; i < cmd.length(); i++)
      for (long j = cmd.length() - 1; j >= i; j--)
      {
        if ((j - i + 1) % 2 == 0 && (j - i + 1) >= maxl)
        {  
          long ibuf = Seq(cmd.substr(i, j - i + 1));
          if (maxl == ibuf) num++;
          else if (maxl < ibuf) { maxl = ibuf; num = 1; }
        }  
      }
   if (maxl == 0) num = 1; 
   cout<<maxl<<" "<<num<<endl;
}

Здесь метод Seq возвращает длину правильной последовательности s,
maxl хранит максимальную длину правильной последовательности,
num - количество последовательностей длины maxl

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Во-первых  cin>>cmd будет очень долго читать строку длиной 106.
Во-вторых насколько я понимаю твое решение работает за куб длины, что тоже оч долго.

Разбор можно почитать здесь
»
6 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится

Anybody from 2019?