大佬求调!70pts,大样例都过了
查看原帖
大佬求调!70pts,大样例都过了
755293
vegetable_doggy楼主2023/10/31 10:54
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int n;
string s;
int cnt;
int las[N];//las[i]表示:i之前第一个与i相匹配的字符的位置(下标) 
		    
int f[N];//f[i]表示:以i为结尾的可消除的字符串的个数 
int main(){
//	freopen("game4.in","r",stdin);
//	freopen("game4.out","w",stdout);
	cin>>n;
	cin>>s;
	s=' '+s;
	las[0]=-1;//防止当下面当i=1时,
			  //会把la[1]赋值为0(应是-1)
	for(int i=1;i<=n;i++){//当las[i]=-1,表示前面不可能有与之相匹配的字符。
		int j=i-1;
		while(s[j]!=s[i]){
			if(las[j]!=-1){//是-1说明前面不可能有与之相匹配的字符了,
				j=las[j]-1;
			}else{
				las[i]=-1;//赋值为-1方便判断i前面是否有可匹配的字符,没有直接跳出 
				break ;
			}
		}
		if(las[i]!=-1) las[i]=j;//如果前面有与之相匹配的字符,就是j 
	}
	for(int i=1;i<=n;i++){
		if(las[i]!=-1){//当前面有与之相匹配的字符时,累加答案; 
			f[i]=f[las[i]-1]+1;
			cnt+=f[i];
		}	
	}
	cout<<cnt;
	return 0;
}
2023/10/31 10:54
加载中...