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 |
|
|
| 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 |