CSP- S T2消消乐35pts求调
  • 板块学术版
  • 楼主Aegleseeker_
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/4 12:24
  • 上次更新2023/11/4 14:37:44
查看原帖
CSP- S T2消消乐35pts求调
736658
Aegleseeker_楼主2023/11/4 12:24

这个是学习的思路(翻到T2)

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5;
const int W=30;
int n;
long long ans;
string s;
int p[N];
int g[N][W];
long long f[N];
void init(){
	for(int i=1;i<n;i++){
		if(s[i]==s[i+1]){
			p[i]=i+1;
		}
	}
    for(int i=n-1;i>=1;i--){
    	if(p[i]!=0||p[i+1]==0||p[i+1]==n){
    		continue;
		}
    	for(int j=0;j<=25;j++){
    		if(j!=s[p[i+1]+1]-'a'){
    			g[i+1][j]=g[p[i+1]+1][j];
			}else{
				g[i+1][j]=p[i+1]+1;
			}
		}
		p[i]=g[i+1][s[i]-'a'];
	}
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    cin>>n>>s;
    s=" "+s;
    init();
    for(int i=n;i>=1;i--){
        if(p[i]){
            f[i]=f[p[i]+1]+1;
        }
        ans+=f[i];
    }
    cout<<ans;
    /*for(int i=1;i<=n;i++){
    	cout<<p[i]<<' ';
	}*/
    return 0;
}
2023/11/4 12:24
加载中...