Submission #23368

# Submission time Handle Problem Language Result Execution time Memory
23368 2017-05-07T05:06:44 Z gs14004 New Ocurrences (KRIII5_NO) C++11
7 / 7
499 ms 49372 KB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pi;
typedef long long lint;
const int MAXN = 100005;
 
int n;
 
struct bit{
	lint tree[MAXN];
	lint sum;
	void add(int x, lint v){
		x++;
		sum += v;
		while(x <= n+1){
			tree[x] += v;
			x += x & -x;
		}
	}
	lint query(int x){
		if(x == n) return sum;
		x++;
		lint ret = 0;
		while(x){
			ret += tree[x];
			x -= x & -x;
		}
		return ret;
	}
}bl, br;
 
struct sfxarray{
	int ord[MAXN], nord[MAXN], cnt[MAXN], aux[MAXN];
	void solve(int n, char *str, int *sfx, int *rev, int *lcp){
		int p = 1;
		memset(ord, 0, sizeof(ord));
		for(int i=0; i<n; i++){
			sfx[i] = i;
			ord[i] = str[i];
		}
		int pnt = 1;
		while(1){
			memset(cnt, 0, sizeof(cnt));
			for(int i=0; i<n; i++){
				cnt[ord[min(i+p, n)]]++;
			}
			for(int i=1; i<=n || i<=255; i++){
				cnt[i] += cnt[i-1];
			}
			for(int i=n-1; i>=0; i--){
				aux[--cnt[ord[min(i+p, n)]]] = i;
			}
			memset(cnt, 0, sizeof(cnt));
			for(int i=0; i<n; i++){
				cnt[ord[i]]++;
			}
			for(int i=1; i<=n || i<=255; i++){
				cnt[i] += cnt[i-1];
			}
			for(int i=n-1; i>=0; i--){
				sfx[--cnt[ord[aux[i]]]] = aux[i];
			}
			if(pnt == n) break;
			pnt = 1;
			nord[sfx[0]] = 1;
			for(int i=1; i<n; i++){
				if(ord[sfx[i-1]] != ord[sfx[i]] || ord[sfx[i-1] + p] != ord[sfx[i] + p]){
					pnt++;
				}
				nord[sfx[i]] = pnt;
			}
			memcpy(ord, nord, sizeof(int) * n);
			p *= 2;
		}
		for(int i=0; i<n; i++){
			rev[sfx[i]] = i;
		}
		int h = 0;
		for(int i=0; i<n; i++){
			if(rev[i]){
				int prv = sfx[rev[i] - 1];
				while(str[prv + h] == str[i + h]) h++;
				lcp[rev[i]] = h;
			}
			h = max(h-1, 0);
		}
	}
}sfxarray;
 
char str[100005];
int sfx[100005], rev[100005], lcp[100005];
lint ans[100005];
 
vector<pi> q[100005];
 
void solve(int s, int e){
	if(s == e) return;
	int m = (s+e)/2;
	solve(s, m);
	solve(m+1, e);
	int l = lcp[m+1];
	int pl = m, pr = m+1;
	ans[min(sfx[m], sfx[m+1])] += l;
	bl.add(sfx[m], 1);
	br.add(sfx[m+1], 1);
	while(pl > s || pr < e){
		if((pr < e && min(l, lcp[pl]) < min(l, lcp[pr+1])) || pl == s){
			l = min(l, lcp[pr+1]);
			int cnt = bl.query(n) - bl.query(sfx[pr+1]);
			q[pl].push_back(pi(sfx[pr+1], l));
			q[m+1].push_back(pi(sfx[pr+1], -l));
			ans[sfx[pr+1]] += 1ll * cnt * l;
			br.add(sfx[pr+1], 1);
			pr++;
		}
		else{
			l = min(l, lcp[pl]);
			int cnt = br.query(n) - br.query(sfx[pl-1]);
			q[m+1].push_back(pi(sfx[pl-1], l));
			q[pr+1].push_back(pi(sfx[pl-1], -l));
			ans[sfx[pl-1]] += 1ll * cnt * l;
			bl.add(sfx[pl-1], 1);
			pl--;
		}
	}
	for(int i=s; i<=m; i++) bl.add(sfx[i], -1);
	for(int i=m+1; i<=e; i++) br.add(sfx[i], -1);
}
 
int main(){
  cin >> str;
	n = strlen(str);
	reverse(str, str + n);
	sfxarray.solve(n, str, sfx, rev, lcp);
	solve(0, n-1);
	for(int i=0; i<n; i++){
		for(auto &j : q[i]){
			bl.add(j.first, j.second);
		}
		ans[sfx[i]] += bl.query(n) - bl.query(sfx[i]);
	}
	for(int i=0; i<n; i++) ans[i] *= 2;
	for(int i=n-1; i>=0; i--){
		ans[i] += ans[i+1] + (n - i);
      	printf("%lld\n", ans[i]);
	}
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 9544 KB Output is correct
2 Correct 0 ms 9544 KB Output is correct
3 Correct 0 ms 9676 KB Output is correct
4 Correct 6 ms 10744 KB Output is correct
5 Correct 13 ms 10776 KB Output is correct
6 Correct 13 ms 10780 KB Output is correct
7 Correct 9 ms 10788 KB Output is correct
8 Correct 0 ms 9544 KB Output is correct
9 Correct 0 ms 9808 KB Output is correct
10 Correct 13 ms 10788 KB Output is correct
11 Correct 13 ms 10748 KB Output is correct
12 Correct 6 ms 10796 KB Output is correct
13 Correct 3 ms 10752 KB Output is correct
14 Correct 6 ms 10876 KB Output is correct
15 Correct 9 ms 10808 KB Output is correct
16 Correct 9 ms 10772 KB Output is correct
17 Correct 9 ms 10752 KB Output is correct
18 Correct 6 ms 10884 KB Output is correct
19 Correct 6 ms 10740 KB Output is correct
20 Correct 13 ms 10752 KB Output is correct
21 Correct 9 ms 10736 KB Output is correct
22 Correct 6 ms 10908 KB Output is correct
23 Correct 9 ms 10748 KB Output is correct
24 Correct 13 ms 10800 KB Output is correct
25 Correct 9 ms 10780 KB Output is correct
26 Correct 6 ms 10740 KB Output is correct
27 Correct 9 ms 10800 KB Output is correct
28 Correct 13 ms 10792 KB Output is correct
29 Correct 6 ms 10760 KB Output is correct
30 Correct 9 ms 10912 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 12324 KB Output is correct
2 Correct 369 ms 47576 KB Output is correct
3 Correct 149 ms 26600 KB Output is correct
4 Correct 363 ms 46760 KB Output is correct
5 Correct 393 ms 48568 KB Output is correct
6 Correct 393 ms 45076 KB Output is correct
7 Correct 416 ms 45064 KB Output is correct
8 Correct 233 ms 48712 KB Output is correct
9 Correct 253 ms 48752 KB Output is correct
10 Correct 293 ms 48984 KB Output is correct
11 Correct 283 ms 48580 KB Output is correct
12 Correct 319 ms 48156 KB Output is correct
13 Correct 363 ms 48732 KB Output is correct
14 Correct 369 ms 48144 KB Output is correct
15 Correct 349 ms 47280 KB Output is correct
16 Correct 363 ms 46804 KB Output is correct
17 Correct 349 ms 46516 KB Output is correct
18 Correct 356 ms 46660 KB Output is correct
19 Correct 313 ms 46976 KB Output is correct
20 Correct 336 ms 46780 KB Output is correct
21 Correct 399 ms 46804 KB Output is correct
22 Correct 433 ms 45744 KB Output is correct
23 Correct 466 ms 49372 KB Output is correct
24 Correct 443 ms 46600 KB Output is correct
25 Correct 419 ms 45580 KB Output is correct
26 Correct 436 ms 47432 KB Output is correct
27 Correct 409 ms 46940 KB Output is correct
28 Correct 426 ms 46168 KB Output is correct
29 Correct 436 ms 45792 KB Output is correct
30 Correct 406 ms 45904 KB Output is correct
31 Correct 426 ms 46244 KB Output is correct
32 Correct 403 ms 45936 KB Output is correct
33 Correct 433 ms 45756 KB Output is correct
34 Correct 429 ms 46668 KB Output is correct
35 Correct 419 ms 46536 KB Output is correct
36 Correct 393 ms 45492 KB Output is correct
37 Correct 409 ms 47744 KB Output is correct
38 Correct 423 ms 45644 KB Output is correct
39 Correct 416 ms 48520 KB Output is correct
40 Correct 499 ms 45716 KB Output is correct
41 Correct 0 ms 9544 KB Output is correct
42 Correct 0 ms 9544 KB Output is correct
43 Correct 0 ms 9676 KB Output is correct
44 Correct 6 ms 10744 KB Output is correct
45 Correct 13 ms 10776 KB Output is correct
46 Correct 13 ms 10780 KB Output is correct
47 Correct 9 ms 10788 KB Output is correct
48 Correct 0 ms 9544 KB Output is correct
49 Correct 0 ms 9808 KB Output is correct
50 Correct 13 ms 10788 KB Output is correct
51 Correct 13 ms 10748 KB Output is correct
52 Correct 6 ms 10796 KB Output is correct
53 Correct 3 ms 10752 KB Output is correct
54 Correct 6 ms 10876 KB Output is correct
55 Correct 9 ms 10808 KB Output is correct
56 Correct 9 ms 10772 KB Output is correct
57 Correct 9 ms 10752 KB Output is correct
58 Correct 6 ms 10884 KB Output is correct
59 Correct 6 ms 10740 KB Output is correct
60 Correct 13 ms 10752 KB Output is correct
61 Correct 9 ms 10736 KB Output is correct
62 Correct 6 ms 10908 KB Output is correct
63 Correct 9 ms 10748 KB Output is correct
64 Correct 13 ms 10800 KB Output is correct
65 Correct 9 ms 10780 KB Output is correct
66 Correct 6 ms 10740 KB Output is correct
67 Correct 9 ms 10800 KB Output is correct
68 Correct 13 ms 10792 KB Output is correct
69 Correct 6 ms 10760 KB Output is correct
70 Correct 9 ms 10912 KB Output is correct