Submission #1708131
Source Code Expand
#include <cstdio> #include <cstdlib> #include <cmath> #include <climits> #include <cfloat> #include <cstring> #include <map> #include <utility> #include <set> #include <iostream> #include <memory> #include <string> #include <vector> #include <list> #include <algorithm> #include <functional> #include <sstream> #include <complex> #include <stack> #include <queue> #include <unordered_set> #include <unordered_map> #include <array> #include <cassert> #include <bitset> using namespace std; using LL = long long; //接尾辞配列を構成する(SA) //高さ配列もついでに作る(LCP) //LCPをセグ木にぶっこむとうれしいことが起きるらしい struct SuffixArray { int n; string str; //sa[k]:=文字列[k,n)は辞書順で何番目か? vector<int>sa, lcp; //文字列sの接尾辞辞書を構成する O(n log n) SuffixArray(string s) :str(s), n(s.size()) { sa.resize(n + 1); vector<int>rank(n + 1); for (int i = 0; i <= n; ++i) { sa[i] = i; rank[i] = (i < n) ? str[i] : -1; } vector<int>tmp(n + 1); for (int k = 1; k <= n; k *= 2) { auto comp = [&](int i, int j) { if (rank[i] != rank[j]) return rank[i] < rank[j]; else { int ri = i + k <= n ? rank[i + k] : -1; int rj = j + k <= n ? rank[j + k] : -1; return ri < rj; } }; sort(sa.begin(), sa.end(), comp); tmp[sa[0]] = 0; for (int i = 1; i <= n; ++i) tmp[sa[i]] = tmp[sa[i - 1]] + (comp(sa[i - 1], sa[i]) ? 1 : 0); rank = tmp; } //ここからLCP構築 lcp.resize(n); for (int i = 0; i < n; ++i)rank[sa[i]] = i; int h = 0; lcp[0] = 0; for (int i = 0; i < n; ++i) { int j = sa[rank[i] - 1]; if (h > 0)--h; for (; j + h < n&&i + h < n; ++h) if (str[j + h] != str[i + h])break; lcp[rank[i] - 1] = h; } } }; int main(void) { string s; cin >> s; SuffixArray sa(s); LL ans = 0; int N = s.size(); for (int i = 0; i < N; ++i) { ans += (i + 1) * (N - i); } for (int i = 0; i < N; ++i) { LL p = sa.lcp[i]; ans -= (p * (p + 1) / 2); } cout << ans << endl; return 0; }
Submission Info
Submission Time | |
---|---|
Task | E - 部分文字列 |
User | platypus |
Language | C++14 (GCC 5.4.1) |
Score | 50 |
Code Size | 2158 Byte |
Status | WA |
Exec Time | 86 ms |
Memory | 2048 KB |
Judge Result
Set Name | Sample | Subtask1 | Subtask2 | Subtask3 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 15 / 15 | 35 / 35 | 0 / 50 | ||||||||||
Status |
|
|
|
|
Set Name | Test Cases |
---|---|
Sample | sample_1.txt, sample_2.txt, sample_3.txt |
Subtask1 | sample_1.txt, sample_2.txt, sample_3.txt, sub1_1.txt, sub1_2.txt, sub1_3.txt, sub1_4.txt, sub1_5.txt, sub1_6.txt, sub1_7.txt, sub1_8.txt, sub1_9.txt |
Subtask2 | sample_1.txt, sample_2.txt, sample_3.txt, sub1_1.txt, sub1_2.txt, sub1_3.txt, sub1_4.txt, sub1_5.txt, sub1_6.txt, sub1_7.txt, sub1_8.txt, sub1_9.txt, sub2_1.txt, sub2_2.txt |
Subtask3 | sample_1.txt, sample_2.txt, sample_3.txt, sub1_1.txt, sub1_2.txt, sub1_3.txt, sub1_4.txt, sub1_5.txt, sub1_6.txt, sub1_7.txt, sub1_8.txt, sub1_9.txt, sub2_1.txt, sub2_2.txt, sub3_1.txt, sub3_2.txt, sub3_3.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
sample_1.txt | AC | 1 ms | 256 KB |
sample_2.txt | AC | 1 ms | 256 KB |
sample_3.txt | AC | 1 ms | 256 KB |
sub1_1.txt | AC | 1 ms | 256 KB |
sub1_2.txt | AC | 1 ms | 256 KB |
sub1_3.txt | AC | 1 ms | 256 KB |
sub1_4.txt | AC | 1 ms | 256 KB |
sub1_5.txt | AC | 1 ms | 256 KB |
sub1_6.txt | AC | 1 ms | 256 KB |
sub1_7.txt | AC | 1 ms | 256 KB |
sub1_8.txt | AC | 1 ms | 256 KB |
sub1_9.txt | AC | 1 ms | 256 KB |
sub2_1.txt | AC | 2 ms | 256 KB |
sub2_2.txt | AC | 2 ms | 256 KB |
sub3_1.txt | AC | 4 ms | 384 KB |
sub3_2.txt | AC | 13 ms | 640 KB |
sub3_3.txt | WA | 86 ms | 2048 KB |