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;
}
posted @ 2025-05-12 16:23  特别之处  阅读(17)  评论(0)    收藏  举报