ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#201336 | #2144. 子串 | snow_trace | 100 | 1792ms | 58068kb | C++ | 2.7kb | 2024-01-23 10:13:56 | 2024-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