悬关,95pts求调,WAon#18
  • 板块灌水区
  • 楼主_x_y_
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/10/30 17:26
  • 上次更新2023/11/2 10:41:15
查看原帖
悬关,95pts求调,WAon#18
590925
_x_y_楼主2023/10/30 17:26
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 2e6 + 10;
int n;
char a[N];
int mp[N][26], nxt[N];
long long f[N];
int main(){
//	freopen("game.in", "r", stdin);
//	freopen("game.out", "w", stdout);
	scanf("%d\n", &n);
	for(int i = 1; i <= n; i++)
		scanf("%c", &a[i]);
	for(int i = 1; i <= n + 1; i++){
		nxt[i] = -1;
		for(int j = 0; j < 26; j++)
			mp[i][j] = -1;
	}
	for(int i = n; i >= 1; i--){
		int pos;
		if(a[i] == a[i + 1]){
			nxt[i] = i+1;
			pos = i+1;
		}
		else{
			pos = mp[i+1][a[i]-'a'];
			if(pos == -1)
				continue;
			nxt[i] = pos;
		}
		for(int j = 0; j < 26; j++)
			mp[i][j] = mp[pos+1][j];
		mp[i][a[pos+1]-'a'] = pos + 1;
	}
	long long ans = 0;
	for(int i = n; i >= 1; i--){
		if(nxt[i] == -1)
			continue;
		f[i] = f[nxt[i] + 1] + 1;
		ans += f[i];
	}
	printf("%lld\n", ans);
	return 0;
}
2023/10/30 17:26
加载中...