为什么下面的代码能过?(我明明算的是O(n^2)但居然过了)
查看原帖
为什么下面的代码能过?(我明明算的是O(n^2)但居然过了)
1420626
UrakSu楼主2024/11/28 16:55
#include<bits/stdc++.h>
using namespace std;
//Ciao
const int N = 2e6 + 10,M = 26;
int n,ne[N],dp[N];//ne[i]表示点i的最近合法节点(若不存在则干脆=0).dp[i]表示以i结尾の合法字串数量 
char s[N];
long long ans;
void get_solve(){
	ios::sync_with_stdio();
	cin >> n >> (s+1);
	for(int i = 2;s[i];i ++){
		if(s[i]==s[i-1]){
			dp[i]=dp[i-2]+1;
			ne[i] = i-1;
		}
		else{
			int m = ne[i-1];
//			cout << i <<':'<<m<<'\n';
			while(s[m-1]!=s[i]&&ne[m-1]){
				m = ne[m-1];
			}
			if(s[m-1]==s[i]){
				dp[i] = dp[m-2]+1;
				ne[i] = m-1;
			}
		}
	}
	
	for(int i = 1;i <= n;i ++)
		ans += dp[i];
	cout << ans;
}
int main(){
	get_solve();
	return 0;
} 
2024/11/28 16:55
加载中...