답안 #23367

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
23367 2017-05-07T05:05:47 Z gs14004 New Ocurrences (KRIII5_NO) C++11
7 / 7
466 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(){
  	scanf("%s", 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]);
	}
}

Compilation message

NO.cpp: In function 'int main()':
NO.cpp:131:20: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%s", str);
                    ^
# 결과 실행 시간 메모리 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 9 ms 10744 KB Output is correct
5 Correct 9 ms 10776 KB Output is correct
6 Correct 13 ms 10780 KB Output is correct
7 Correct 6 ms 10788 KB Output is correct
8 Correct 0 ms 9544 KB Output is correct
9 Correct 3 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 3 ms 10796 KB Output is correct
13 Correct 13 ms 10752 KB Output is correct
14 Correct 9 ms 10876 KB Output is correct
15 Correct 13 ms 10808 KB Output is correct
16 Correct 13 ms 10772 KB Output is correct
17 Correct 13 ms 10752 KB Output is correct
18 Correct 13 ms 10884 KB Output is correct
19 Correct 16 ms 10740 KB Output is correct
20 Correct 9 ms 10752 KB Output is correct
21 Correct 13 ms 10736 KB Output is correct
22 Correct 13 ms 10908 KB Output is correct
23 Correct 16 ms 10748 KB Output is correct
24 Correct 13 ms 10800 KB Output is correct
25 Correct 13 ms 10780 KB Output is correct
26 Correct 3 ms 10740 KB Output is correct
27 Correct 13 ms 10800 KB Output is correct
28 Correct 9 ms 10792 KB Output is correct
29 Correct 13 ms 10760 KB Output is correct
30 Correct 13 ms 10912 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 12324 KB Output is correct
2 Correct 383 ms 47576 KB Output is correct
3 Correct 166 ms 26600 KB Output is correct
4 Correct 383 ms 46760 KB Output is correct
5 Correct 359 ms 48568 KB Output is correct
6 Correct 403 ms 45076 KB Output is correct
7 Correct 426 ms 45064 KB Output is correct
8 Correct 253 ms 48712 KB Output is correct
9 Correct 243 ms 48752 KB Output is correct
10 Correct 306 ms 48984 KB Output is correct
11 Correct 316 ms 48580 KB Output is correct
12 Correct 336 ms 48156 KB Output is correct
13 Correct 353 ms 48732 KB Output is correct
14 Correct 376 ms 48144 KB Output is correct
15 Correct 369 ms 47280 KB Output is correct
16 Correct 363 ms 46804 KB Output is correct
17 Correct 379 ms 46516 KB Output is correct
18 Correct 383 ms 46660 KB Output is correct
19 Correct 346 ms 46976 KB Output is correct
20 Correct 306 ms 46780 KB Output is correct
21 Correct 376 ms 46804 KB Output is correct
22 Correct 403 ms 45744 KB Output is correct
23 Correct 399 ms 49372 KB Output is correct
24 Correct 426 ms 46600 KB Output is correct
25 Correct 466 ms 45580 KB Output is correct
26 Correct 419 ms 47432 KB Output is correct
27 Correct 419 ms 46940 KB Output is correct
28 Correct 429 ms 46168 KB Output is correct
29 Correct 426 ms 45792 KB Output is correct
30 Correct 443 ms 45904 KB Output is correct
31 Correct 433 ms 46244 KB Output is correct
32 Correct 406 ms 45936 KB Output is correct
33 Correct 403 ms 45756 KB Output is correct
34 Correct 466 ms 46668 KB Output is correct
35 Correct 426 ms 46536 KB Output is correct
36 Correct 426 ms 45492 KB Output is correct
37 Correct 439 ms 47744 KB Output is correct
38 Correct 436 ms 45644 KB Output is correct
39 Correct 403 ms 48520 KB Output is correct
40 Correct 409 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 9 ms 10744 KB Output is correct
45 Correct 9 ms 10776 KB Output is correct
46 Correct 13 ms 10780 KB Output is correct
47 Correct 6 ms 10788 KB Output is correct
48 Correct 0 ms 9544 KB Output is correct
49 Correct 3 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 3 ms 10796 KB Output is correct
53 Correct 13 ms 10752 KB Output is correct
54 Correct 9 ms 10876 KB Output is correct
55 Correct 13 ms 10808 KB Output is correct
56 Correct 13 ms 10772 KB Output is correct
57 Correct 13 ms 10752 KB Output is correct
58 Correct 13 ms 10884 KB Output is correct
59 Correct 16 ms 10740 KB Output is correct
60 Correct 9 ms 10752 KB Output is correct
61 Correct 13 ms 10736 KB Output is correct
62 Correct 13 ms 10908 KB Output is correct
63 Correct 16 ms 10748 KB Output is correct
64 Correct 13 ms 10800 KB Output is correct
65 Correct 13 ms 10780 KB Output is correct
66 Correct 3 ms 10740 KB Output is correct
67 Correct 13 ms 10800 KB Output is correct
68 Correct 9 ms 10792 KB Output is correct
69 Correct 13 ms 10760 KB Output is correct
70 Correct 13 ms 10912 KB Output is correct