UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#201336#2144. 子串snow_trace1001792ms58068kbC++2.7kb2024-01-23 10:13:562024-01-23 12:23:17

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
char s[400005];int tp[400005],a[400005],sa[400005],rk[400005],h[400005],pre[500005],A[500005],d[500005],pred[500005],lg[1200005];
int n;
int st[200005][20];
void qsort(){
	for(int i= 1;i<=max(n,200ll);i++)a[i] = 0;
	for(int i = 1;i<=n;i++)a[rk[i]]++;
	for(int i = 1;i<=max(n,200ll);i++)a[i]+=a[i-1];
	for(int i =n;i>=1;i--)sa[a[rk[tp[i]]]--] = tp[i];
}void SA(){
	for(int k = 1;k<=n;k<<=1){
		int tot =0;
		for(int i = n-k+1;i<=n;i++)tp[++tot] =i;
		for(int i = 1;i<=n;i++)if(sa[i]>k)tp[++tot] = sa[i]-k;
		qsort();swap(tp,rk);rk[sa[1]] = 1;
		for(int i = 2;i<=n;i++)rk[sa[i]] = rk[sa[i-1]]+1-(tp[sa[i]] == tp[sa[i-1]] and tp[sa[i]+k] == tp[sa[i-1]+k]);
	}return;
}
void GET_HEIGHT(){
	int l = 0;
	for(int i = 1;i<=n;i++)rk[sa[i]] = i;
	for(int i = 1;i<=n;i++){
		if(rk[i] == 1)continue;
		if(l)--l;
		int j = sa[rk[i]-1];
		while(i+l<=n and j+l<=n and s[i+l] == s[j+l])l++;
		h[rk[i]] = l;
	}for(int i = 1;i<=n;i++)st[i][0] = h[i];
	for(int i = 1;i<=18;i++){
		for(int j = 1;j+(1<<i)-1<=n;j++){
			st[j][i] = min(st[j][i-1],st[j+(1<<i-1)][i-1]);
		}
	}for(int i =1;i<=n;i++)d[i] = (n-sa[i]+1)-h[i];
	for(int i = 1;i<=n;i++)pred[i] = pred[i-1]+d[i];
	return;
}inline int query(int l,int r){
	int id = rk[l],len = r-l+1;int now = id;
	for(int i = 18;i>=0;i--){
		int p = now-(1<<i)+1;
		if(p<1)continue;
		if(st[p][i]>=len)now = p-1;
	}int ans = pred[now-1]+(len-h[now]);
	return pred[n]-ans+1;
}vector<pair<int,int> >ans;
bool cmp(pair<int,int>a,pair<int,int>b){
	return a.first<b.first;
}signed main(){
	for(int i =0;i<20;i++){
		for(int j = (1<<i);j<(1<<i+1);j++)lg[j] = i;
	}scanf("%s",s+1);n = strlen(s+1);
	for(int i = 1;i<=n;i++)cin >>A[i];
	for(int i = 1;i<=n;i++)pre[i] = pre[i-1]+A[i];
	for(int i = 1;i<=n;i++){
		rk[i] = s[i];tp[i] = i;
	}qsort();
//	for(int i = 1;i<=n;i++)cout<<sa[i]<<' ';;cout<<endl;
//	for(int i =1;i<=n;i++)cout<<rk[i]<<' ';cout<<endl;
	SA();GET_HEIGHT();
//	for(int i = 1;i<=n;i++)cout<<sa[i]<< ' ';cout<<endl;
/////	for(int i = 1;i<=n;i++)cout<<rk[i]<<' ';cout<<endl;
//	for(int i = 1;i<=n;i++)cout<<h[i]<<' ';cout<<endl;
//	cout<<query(1,1)<<" "<<query(3,4)<<' '<<query(4,4)<<endl;
	for(int i = 1;i<=n;i++){
		int l = i,r = n;
		while(l<=r){
			int mid = l+r+1>>1;
			int rk = query(i,mid);
			if(rk == pre[mid]-pre[i-1]){ans.push_back({i,mid});break;}
		//	cout<<l <<' '<<r<<' '<<i<< ' '<<mid<<' '<<rk<<' '<<pre[mid]-pre[i-1]<<endl;
			if(rk>pre[mid]-pre[i-1])l = mid+1;
			else r = mid-1;
		}
	}sort(ans.begin(),ans.end(),cmp);
	cout<<ans.size()<<'\n';
	for(int i = 0;i<ans.size();i++){
		cout<<ans[i].first<<" "<<ans[i].second<<'\n';
	}
	return 0;
}

Details

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 8ms
memory: 15764kb

input:

eddhceagddbdaeadfezzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
135 894 525 197 184 248 415 312 228 398 424 704 5...

output:

9
20 28
21 29
23 31
25 32
27 35
30 38
32 40
37 46
39 48

result:

ok 19 numbers

Test #2:

score: 10
Accepted
time: 4ms
memory: 15960kb

input:

cababhaddefeechdcaeebfdheffdcfaefbegaebeahafbhadheaacdagafbcccghddfehhaagafhhfdhcdheghchfdbhfahbdefc...

output:

39
765 833
767 838
770 841
777 850
779 851
781 852
782 853
784 855
806 874
809 875
810 877
814 882
8...

result:

ok 79 numbers

Test #3:

score: 10
Accepted
time: 4ms
memory: 15960kb

input:

cacdcaaadcdaacbcddbccdbaccdacbcabaddaadaccacabbdaccdbdddbcdddbaacddcdcccbcababbadddaccddadddaddcccbc...

output:

110
1 319
253 647
429 578
431 579
434 583
438 588
442 593
444 594
446 596
451 600
452 601
456 605
46...

result:

ok 221 numbers

Test #4:

score: 10
Accepted
time: 81ms
memory: 26016kb

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

903
8 932
119 1057
178 1111
231 1160
415 1338
419 1345
578 1499
668 1582
684 1595
770 1673
795 1700
...

result:

ok 1807 numbers

Test #5:

score: 10
Accepted
time: 101ms
memory: 26180kb

input:

aabdbcabcabddaaccaabcdbcdcadbaababababccbabaacccccdbcbdbddbadbbddcadddbaddbdbdbdcaaabdbbccbbadadbbca...

output:

3
110 17851
11334 40746
14930 28575

result:

ok 7 numbers

Test #6:

score: 10
Accepted
time: 96ms
memory: 26084kb

input:

dbddcbaaabaddcaacbcbddaabbbabadbbdcbdbaddcbabaacdcdcdccaccbbddcbdccbbbaabbbbadbaadabdaacdadabcadcadd...

output:

1573
40657 42887
40663 42891
40669 42896
40672 42899
40678 42904
40681 42908
40682 42911
40683 42912...

result:

ok 3147 numbers

Test #7:

score: 10
Accepted
time: 98ms
memory: 26236kb

input:

bcaacbccddcacddyacaadccbaccabdbdaaaabcadbdadcdccbcdacacdbdbabacbaadaddabbddddabbcbcccdaabbdbddabcdbc...

output:

2317
37710 40923
37715 40925
37719 40928
37725 40933
37727 40937
37731 40941
37733 40944
37734 40945...

result:

ok 4635 numbers

Test #8:

score: 10
Accepted
time: 468ms
memory: 57348kb

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

2
29559 63104
88947 168714

result:

ok 5 number(s): "2 29559 63104 88947 168714"

Test #9:

score: 10
Accepted
time: 475ms
memory: 57880kb

input:

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...

output:

4
90135 135863
155071 177352
155440 185439
155842 194241

result:

ok 9 numbers

Test #10:

score: 10
Accepted
time: 457ms
memory: 58068kb

input:

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...

output:

3
110013 137452
132017 167846
132029 193124

result:

ok 7 numbers