CSES - TCR Contest - Results
Submission details
Task:Substrings
Sender:KnowYourArchitecture
Submission time:2017-11-21 20:59:34 +0200
Language:C++
Status:READY
Result:
Test results
testverdicttime
#1ACCEPTED0.10 sdetails
#20.12 sdetails
#30.11 sdetails
#40.14 sdetails

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:52:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < sa.size(); i++) {
                              ^

Code

#include <bits/stdc++.h>
using namespace std;

vector<int> suffixArray(string &s, int S) {
	int n=s.size(); int N=n+S;
	vector<int> sa(n), ra(n);
	for (int i=0;i<n;i++) {sa[i]=i;ra[i]=s[i]; }
	for (int k=0;k<n;k?k*=2:k++) {
		vector<int> nsa(sa), nra(n), cnt(N);
		for (int i=0;i<n;i++) nsa[i]=(nsa[i]-k+n)%n;
		for (int i=0;i<n;i++) cnt[ra[i]]++;
		for (int i=1;i<N;i++) cnt[i]+=cnt[i-1];
		for (int i=n-1;i>=0;i--) sa[--cnt[ra[nsa[i]]]]=nsa[i];
		int r=0;
		for (int i=1;i<n;i++) {
			if(ra[sa[i]]!=ra[sa[i-1]]) r++;
			else if(ra[(sa[i]+k)%n]!=ra[(sa[i-1]+k)%n]) r++;
			nra[sa[i]]=r;
		}
		ra=nra;
	}
	return sa;
}
vector<int> lcpArray(string &s, vector<int> sa) {
	int n=s.size(), k=0;
	vector<int> ra(n), lcp(n);
	for (int i=0;i<n;i++) ra[sa[i]]=i;
	for (int i=0;i<n;i++) {
		if (k) k--;
		if (ra[i]==n-1) {
			k=0;
			continue;
		}
		int j=sa[ra[i]+1];
		while (k<n && s[(i+k)%n]==s[(j+k)%n]) k++;
		lcp[ra[i]]=k;
		if (ra[(sa[ra[i]]+1)%n]>ra[(sa[ra[j]]+1)%n]) k=0;
	}
	return lcp;
}

int main() {
	string s;
	cin >> s;

	auto s2=s+"$";
	auto sa = suffixArray(s2, 256);
	auto lcp = lcpArray(s2, sa);

	int r = s.size()*(s.size()+1)/2;
	//for (int i : lcp) cout << i << " "; cout << endl;
	for (int i = 0; i < sa.size(); i++) {
		r -= lcp[i];
	}

	cout << r << endl;
}

Test details

Test 1

Verdict: ACCEPTED

input
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...

correct output
100000

user output
100000

Test 2

Verdict:

input
BBABAABABBBAAAABAAABBBBBAABBAB...

correct output
4998501161

user output
703533865

Test 3

Verdict:

input
DCBBABDCCCDACABDBBDCDBCBBCAAAC...

correct output
4999300351

user output
704333055

Test 4

Verdict:

input
RSCJOOIABPKYDZMZPBCIXNWOSNRWYQ...

correct output
4999757536

user output
704790240