GYM103427M String Problem 题解
我们考虑一个新的答案一定是一个旧的答案的\(boder\)(这里可以为空)再多一个点,证明考虑说如果不是旧的答案的\(boder\),字典序一定比旧的答案要小,不是最优的,然后根据\(kmp\)的复杂度,直接暴力跳kmp计算即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int nxt[maxn],a[maxn],b[maxn],len,lin;
string s;
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>s;
for(int i=0;i<s.size();i++){
a[i+1]=s[i]-'a'+1;
}
cout<<"1 1"<<'\n';
len=1;
b[1]=a[1];
for(int i=2;i<=s.size();i++){
while(len&&b[nxt[len]+1]<a[i]){
len=nxt[len];
}
len++;
b[len]=a[i];
cout<<i-len+1<<' '<<i<<'\n';
lin=nxt[len-1];
while(lin&&b[lin+1]!=b[len]){
lin=nxt[lin];
}
if(len!=1&&b[lin+1]==b[len]){
lin++;
}
nxt[len]=lin;
}
return 0;
}
浙公网安备 33010602011771号