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
AC × 3
AC × 12
AC × 14
AC × 16
WA × 1
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