begoon's blog

By begoon, 14 years ago, In Russian
http://acmp.ru/index.asp?main=task&id_task=433

Подскажите идею динамики. Судя по ограничению в 10^6 там требуется максимум n*log(n) решение. 

У меня пока, увы, только квадратичное, которые, ясное дело, падает с TLE:

void solve(istream& is, ostream& os) {
  int n;
  string s;
  is >> n >> s;
  vector<int> dp(n, 0);
  unsigned long long ans = 0;
  for (int i = 0; i < n; ++i) {
    dp[i] = s[i] == 'a' ? +1 : -1;
    for (int j = 0; j < i; ++j) {
      dp[j] += dp[i];
      if (dp[j] == 0)
        ans += 1;
    }
  }
  os << ans << endl;
}

Не пойму, как делать половинное деление, чтобы получить log(n), ведь приходится проверять подстроки не только в кусках с границами в 1/2, 1/4, 1/8 и т.д., но пересекающие их.

  • Vote: I like it
  • 0
  • Vote: I do not like it