Submission #35515406


Source Code Expand

#include <bits/stdc++.h>
using namespace std;
#include <atcoder/string>
#include <atcoder/segtree>
using namespace atcoder;

int op(int a, int b) { return min(a, b); }
int e() { return (int)1e9; }

int N;
string S, T, U;
vector<int> sa, lcpa, sa_inv;
segtree<int, op, e> seg;

// f(S, i) ≤ f(T, j) か?
bool leq(int i, int j)
{
  int l = sa_inv[i], r = sa_inv[2 * N + j];
  if (l > r)
    swap(l, r);
  int len = seg.prod(l, r); // 一致している長さ
  if (len >= N) // N 文字一致していたら等しい
    return true;
  return U[i + len] <= U[2 * N + j + len]; // 一致しない最初の文字を比較
}

int main()
{
  cin >> N >> S >> T;
  U = S + S + T + T;

  // f(S, i) ≤ f(T, j) かを判定するために必要な情報を求める
  // sa_inv[i] は i が sa のどこにあるかを表す
  sa = suffix_array(U);
  lcpa = lcp_array(U, sa);
  sa_inv.resize(4 * N);
  for (int i = 0; i < 4 * N; i++)
  {
    sa_inv[sa[i]] = i;
  }
  seg = segtree<int, op, e>(lcpa);

  // f(T, P[i]) ≤ f(T, P[i + 1]) を満たす順列 P を求める
  vector<int> P;
  vector<int> sa2 = suffix_array(T + T);
  for (int i = 0; i < 2 * N; i++)
  {
    if (sa2[i] < N)
      P.push_back(sa2[i]);
  }

  long long ans = 0;
  for (int i = 0; i < N; i++)
  {
    // f(S, i) ≤ f(T, P[k]) を満たす k の境界を二分探索で求める(満たすほうが ok で満たさないほうが ng)
    int ok = N, ng = -1;
    while (abs(ok - ng) > 1)
    {
      int mid = (ok + ng) / 2;
      if (leq(i, P[mid]))
        ok = mid;
      else
        ng = mid;
    }
    int tmp = N - ok; // 満たすものの個数
    ans += tmp;
  }
  cout << ans << endl;
}

Submission Info

Submission Time
Task F - Two Strings
User miscalculation53
Language C++ (GCC 9.2.1)
Score 500
Code Size 1741 Byte
Status AC
Exec Time 532 ms
Memory 31524 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 2
AC × 72
Set Name Test Cases
Sample example_00.txt, example_01.txt
All example_00.txt, example_01.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt, test_43.txt, test_44.txt, test_45.txt, test_46.txt, test_47.txt, test_48.txt, test_49.txt, test_50.txt, test_51.txt, test_52.txt, test_53.txt, test_54.txt, test_55.txt, test_56.txt, test_57.txt, test_58.txt, test_59.txt, test_60.txt, test_61.txt, test_62.txt, test_63.txt, test_64.txt, test_65.txt, test_66.txt, test_67.txt, test_68.txt, test_69.txt
Case Name Status Exec Time Memory
example_00.txt AC 8 ms 3568 KiB
example_01.txt AC 2 ms 3576 KiB
test_00.txt AC 324 ms 24792 KiB
test_01.txt AC 350 ms 26524 KiB
test_02.txt AC 85 ms 9536 KiB
test_03.txt AC 121 ms 11356 KiB
test_04.txt AC 5 ms 3688 KiB
test_05.txt AC 2 ms 3616 KiB
test_06.txt AC 295 ms 20052 KiB
test_07.txt AC 38 ms 6208 KiB
test_08.txt AC 301 ms 20384 KiB
test_09.txt AC 115 ms 10880 KiB
test_10.txt AC 31 ms 5028 KiB
test_11.txt AC 65 ms 8556 KiB
test_12.txt AC 250 ms 18312 KiB
test_13.txt AC 461 ms 29368 KiB
test_14.txt AC 160 ms 15056 KiB
test_15.txt AC 502 ms 30340 KiB
test_16.txt AC 495 ms 30336 KiB
test_17.txt AC 500 ms 30328 KiB
test_18.txt AC 495 ms 30400 KiB
test_19.txt AC 495 ms 30400 KiB
test_20.txt AC 494 ms 30392 KiB
test_21.txt AC 496 ms 30500 KiB
test_22.txt AC 491 ms 30380 KiB
test_23.txt AC 508 ms 30436 KiB
test_24.txt AC 499 ms 30512 KiB
test_25.txt AC 532 ms 31456 KiB
test_26.txt AC 515 ms 31392 KiB
test_27.txt AC 523 ms 31336 KiB
test_28.txt AC 517 ms 31352 KiB
test_29.txt AC 521 ms 31456 KiB
test_30.txt AC 517 ms 31520 KiB
test_31.txt AC 512 ms 31348 KiB
test_32.txt AC 511 ms 31428 KiB
test_33.txt AC 511 ms 31360 KiB
test_34.txt AC 510 ms 31384 KiB
test_35.txt AC 481 ms 31360 KiB
test_36.txt AC 487 ms 31424 KiB
test_37.txt AC 479 ms 31400 KiB
test_38.txt AC 480 ms 31420 KiB
test_39.txt AC 476 ms 31452 KiB
test_40.txt AC 478 ms 31376 KiB
test_41.txt AC 473 ms 31524 KiB
test_42.txt AC 485 ms 31416 KiB
test_43.txt AC 495 ms 31408 KiB
test_44.txt AC 493 ms 31344 KiB
test_45.txt AC 269 ms 28340 KiB
test_46.txt AC 262 ms 28240 KiB
test_47.txt AC 264 ms 28360 KiB
test_48.txt AC 266 ms 28328 KiB
test_49.txt AC 265 ms 28240 KiB
test_50.txt AC 265 ms 28256 KiB
test_51.txt AC 267 ms 28256 KiB
test_52.txt AC 265 ms 28416 KiB
test_53.txt AC 264 ms 28328 KiB
test_54.txt AC 266 ms 28316 KiB
test_55.txt AC 479 ms 30288 KiB
test_56.txt AC 475 ms 30320 KiB
test_57.txt AC 465 ms 30152 KiB
test_58.txt AC 491 ms 30376 KiB
test_59.txt AC 488 ms 30156 KiB
test_60.txt AC 491 ms 30216 KiB
test_61.txt AC 494 ms 30372 KiB
test_62.txt AC 478 ms 30276 KiB
test_63.txt AC 478 ms 30272 KiB
test_64.txt AC 479 ms 30312 KiB
test_65.txt AC 311 ms 28312 KiB
test_66.txt AC 303 ms 28344 KiB
test_67.txt AC 308 ms 28292 KiB
test_68.txt AC 326 ms 28240 KiB
test_69.txt AC 3 ms 3576 KiB