时间复杂度求助
查看原帖
时间复杂度求助
800543
NirvanaCeleste楼主2024/10/11 21:26
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2000200;
#define ull unsigned long long
int n;
string s;
int nxt[maxn],dp[maxn];
//nxt 是最近一个可消除的子串的左端点 如没有可消除的子串则为0 
//dp 为以i为结尾的字符串有多少可消除的子串 
ull ans;
int main(){
	cin >> n >> s;
	s = " " + s;
	int t = 1;
	for(int i=1;i<=n;i++){
		t = i-1;
		while(t > 0){
			if(s[t] == s[i]) break;
			t = nxt[t];
			if(t) t--;
		}
		nxt[i] = t;
		if(t) dp[i] = dp[t-1] + 1;//t--后可能为零 
		ans += dp[i];
	}
	cout<<ans;
	return 0;
}
2024/10/11 21:26
加载中...