Submission #3217848
Source Code Expand
# include <iostream>
# include <algorithm>
#include <array>
# include <cassert>
#include <cctype>
#include <climits>
#include <numeric>
# include <vector>
# include <string>
# include <set>
# include <map>
# include <cmath>
# include <iomanip>
# include <functional>
# include <tuple>
# include <utility>
# include <stack>
# include <queue>
# include <list>
# include <bitset>
# include <complex>
# include <chrono>
# include <random>
# include <limits.h>
# include <unordered_map>
# include <unordered_set>
# include <deque>
# include <cstdio>
# include <cstring>
#include <stdio.h>
#include<time.h>
#include <stdlib.h>
#include <cstdint>
#include <cfenv>
#include<fstream>
//#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using ULL = unsigned long long;
long long MOD = 1000000000 + 7;
constexpr long long INF = numeric_limits<LL>::max();
const double PI = acos(-1);
#define fir first
#define sec second
#define thi third
#define debug(x) cerr<<#x<<": "<<x<<'\n'
typedef pair<LL, LL> Pll;
typedef pair<LL, pair<LL, LL>> Ppll;
typedef pair<LL, pair<LL, bitset<100001>>> Pbll;
typedef pair<LL, pair<LL, vector<LL>>> Pvll;
typedef pair<LL, LL> Vec2;
struct Tll { LL first, second, third; };
struct Fll { LL first, second, third, fourth; };
typedef pair<LL, Tll> Ptll;
#define rep(i,rept) for(LL i=0;i<rept;i++)
#define Mfor(i,mf) for(LL i=mf-1;i>=0;i--)
LL h, w, n, m, k, t, s, p, q, last, first, cnt, sum, ans, dp[200000];
Fll a[300000], b[300000];
string str, ss;
bool f;
char c, ch[100][100];
int di[4][2] = { { 0,1 },{ 1,0 },{ 0,-1 },{ -1,0 } };
struct Edge { LL to, cost; };
vector<Edge>vec[200000];
vector<LL>v;
map<Fll, LL>ma;
multiset<LL>st;
void YN(bool f) {
if (f)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
void yn(bool f) {
if (f)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
struct SuffixArray{
vector< int > SA, LCP;
string s;
void Build_SA(const string& str){
s = str;
SA.resize(s.size());
iota(begin(SA), end(SA), 0);
sort(begin(SA), end(SA), [&](const int& a, const int& b) {
if (s[a] == s[b]) return (a > b);
return (s[a] < s[b]);
});
vector< int > classes(s.size()), c(s.size()), cnt(s.size());
for (int i = 0; i < s.size(); i++) {
c[i] = s[i];
}
for (int len = 1; len < s.size(); len <<= 1) {
for (int i = 0; i < s.size(); i++) {
if (i > 0 && c[SA[i - 1]] == c[SA[i]] && SA[i - 1] + len < s.size() && c[SA[i - 1] + len / 2] == c[SA[i] + len / 2]) {
classes[SA[i]] = classes[SA[i - 1]];
}
else {
classes[SA[i]] = i;
}
}
iota(begin(cnt), end(cnt), 0);
copy(begin(SA), end(SA), begin(c));
for (int i = 0; i < s.size(); i++) {
int s1 = c[i] - len;
if (s1 >= 0) SA[cnt[classes[s1]]++] = s1;
}
classes.swap(c);
}
}
void Build_LCP(){
vector< int > rank(s.size());
for (int i = 0; i < s.size(); i++) {
rank[SA[i]] = i;
}
LCP.resize(s.size() - 1);
for (int i = 0, h = 0; i < s.size(); i++) {
if (rank[i] + 1 < s.size()) {
for (int j = SA[rank[i] + 1]; max(i, j) + h < s.length() && s[i + h] == s[j + h]; ++h);
LCP[rank[i]] = h;
if (h > 0) --h;
}
}
}
int operator[](int k) const{
return (SA[k]);
}
int size() const {
return (s.size());
}
bool lt_substr(string& t, int si = 0, int ti = 0){
int sn = s.size(), tn = t.size();
while (si < sn && ti < tn) {
if (s[si] < t[ti]) return (true);
if (s[si] > t[ti]) return (false);
++si, ++ti;
}
return (si >= sn && ti < tn);
}
int lower_bound(string& t){
int low = -1, high = SA.size();
while (high - low > 1) {
int mid = (low + high) >> 1;
if (lt_substr(t, SA[mid])) low = mid;
else high = mid;
}
return (high);
}
};
int main() {
cin >> str;
rep(i, str.size()) {
ans += (str.size() - i)*(i + 1);
}
SuffixArray sa;
sa.Build_SA(str);
sa.Build_LCP();
rep(i, str.size()-1) {
ans-=sa.LCP[i]*(sa.LCP[i]+1)/2;
}
cout << ans << endl;
return 0;
}
Submission Info
Submission Time |
|
Task |
E - 部分文字列 |
User |
akusyounin |
Language |
C++14 (GCC 5.4.1) |
Score |
100 |
Code Size |
4091 Byte |
Status |
AC |
Exec Time |
49 ms |
Memory |
8192 KB |
Judge Result
Set Name |
Sample |
Subtask1 |
Subtask2 |
Subtask3 |
Score / Max Score |
0 / 0 |
15 / 15 |
35 / 35 |
50 / 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 |
3 ms |
6400 KB |
sample_2.txt |
AC |
3 ms |
6400 KB |
sample_3.txt |
AC |
3 ms |
6400 KB |
sub1_1.txt |
AC |
3 ms |
6400 KB |
sub1_2.txt |
AC |
2 ms |
6400 KB |
sub1_3.txt |
AC |
3 ms |
6400 KB |
sub1_4.txt |
AC |
3 ms |
6400 KB |
sub1_5.txt |
AC |
2 ms |
6400 KB |
sub1_6.txt |
AC |
2 ms |
6400 KB |
sub1_7.txt |
AC |
2 ms |
6400 KB |
sub1_8.txt |
AC |
3 ms |
6400 KB |
sub1_9.txt |
AC |
3 ms |
6400 KB |
sub2_1.txt |
AC |
3 ms |
6400 KB |
sub2_2.txt |
AC |
3 ms |
6400 KB |
sub3_1.txt |
AC |
4 ms |
6528 KB |
sub3_2.txt |
AC |
9 ms |
6784 KB |
sub3_3.txt |
AC |
49 ms |
8192 KB |