Submission #1512474


Source Code Expand

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <sstream>
#include <cmath>
#include <set>
#include <iomanip>
#include <deque>
#include <stdio.h>
#include <random>
using namespace std;

#define REP(i,n) for(int (i)=0;(i)<(int)(n);(i)++)
#define RREP(i,n) for(int (i)=(int)(n)-1;i>=0;i--)
#define REMOVE(Itr,n) (Itr).erase(remove((Itr).begin(),(Itr).end(),n),(Itr).end())
typedef long long ll;

class SuffixArray {
    
private:
    
    int N,k;
    string S;
    vector< int > rank_sa, tmp, sa;
    
    void build_suffix_array() {
        rank_sa.resize(N + 1), tmp.resize(N + 1), sa.resize(N + 1);
        auto compare_sa = [&] (int i, int j) -> bool {
            if (rank_sa[i] != rank_sa[j]) {
                return rank_sa[i] < rank_sa[j];
            } else {
                int ri = i + k <= N ? rank_sa[i + k] : -1;
                int rj = j + k <= N ? rank_sa[j + k] : -1;
                return ri < rj;
            }
        };
        for (int i = 0; i <= N; i++) {
            sa[i] = i;
            rank_sa[i] = i < N ? S[i] : -1;
        }
        for (k = 1; k <= N; k <<= 1) {
            sort(sa.begin(), sa.end(), compare_sa);
            tmp[sa[0]] = 0;
            for (int i = 0; i <= N; i++) {
                tmp[sa[i]] = tmp[sa[i-1]] + (compare_sa(sa[i-1], sa[i]) ? 1 : 0);
            }
            for (int i = 0; i <= N; i++) {
                rank_sa[i] = tmp[i];
            }
        }
    }
    
    vector< int > rank_lcp;
    vector< int > lcp;
    
    void build_lcp() {
        rank_lcp.resize(N + 1), lcp.resize(N + 1, 0);
        for (int i = 0; i <= N; i++) {
            rank_lcp[sa[i]] = i;
        }
        int h = 0;
        for (int i = 0; i < N; i++) {
            int j = sa[rank_lcp[i] - 1];
            if (h > 0) h--;
            while (j + h < N && i + h < N) {
                if (S[j + h] != S[i + h]) break;
                h++;
            }
            lcp[rank_lcp[i] - 1] = h;
        }
    }
    
public:
    
    SuffixArray (string s) : S(s), N((int)s.size()) {
        build_suffix_array();
        build_lcp();
    }
    
    int get_lcp(int idx) {
        return lcp[idx];
    }
    
    int get_rank(int idx) {
        return rank_sa[idx];
    }
    
    int operator [] (int idx) {
        return sa[idx];
    }
    
};


int main() {
    
    
    string s; cin >> s;
    SuffixArray inst(s);
    
    ll ans = 0;
    REP(i,s.size()) {
        ll len = (int)s.size() - inst[i + 1];
        ans += len * (len + 1) / 2 - inst.get_lcp(i) * (inst.get_lcp(i) + 1) / 2;
    }
    
    cout << ans << endl;
    
    return 0;
}


Submission Info

Submission Time
Task E - 部分文字列
User kosakkun
Language C++14 (GCC 5.4.1)
Score 100
Code Size 2818 Byte
Status AC
Exec Time 81 ms
Memory 2432 KB

Judge Result

Set Name Sample Subtask1 Subtask2 Subtask3
Score / Max Score 0 / 0 15 / 15 35 / 35 50 / 50
Status
AC × 3
AC × 12
AC × 14
AC × 17
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 1 ms 256 KB
sub2_2.txt AC 2 ms 256 KB
sub3_1.txt AC 3 ms 384 KB
sub3_2.txt AC 13 ms 640 KB
sub3_3.txt AC 81 ms 2432 KB