//25求调!!!
查看原帖
//25求调!!!
360336
xmanaoa楼主2023/11/1 10:43
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2000001;
char s[MAXN];
int sum;
int n;
int f[MAXN];
int m[MAXN];//记录以i结尾的最短能消除字符串开始时的字符的位置 
int main(){
	
	scanf("%d",&n);
	
	for(int i=1;i<=n;i++){
		cin>>s[i];
	}
	
	//先判断它有没有最短的字符串 
	for(int i=1;i<=n;i++){
		if(i==1){
			m[1]=0;
			continue;
		}
		if(s[i]==s[i-1]){
			m[i]=i-1;
			continue;
		}
		
		if(m[i-1]!=0&&s[i]==s[m[i-1]-1]){
			m[i]=m[i-1]-1;
		}
	
 	
		 	//cout<<f[i]<<" ";
}
	//cout<<sum<<endl;
	
	for(int i=1;i<=n;i++){
			if(m[i]!=0) {
		f[i]=1;
		
		 }
	}
	
	for(int i=1;i<=n;i++){
		
		if(m[i]!=0){
		f[i]+=f[m[i]-1];
		}
	
		sum+=f[i];
	}
	


	cout<<sum;
	


	return 0;
}
2023/11/1 10:43
加载中...