社区讨论

大佬求调!70pts,大样例都过了

P9753[CSP-S 2023] 消消乐参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lodqk76p
此快照首次捕获于
2023/10/31 10:54
2 年前
此快照最后确认于
2023/11/02 10:35
2 年前
查看原帖
CPP
#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;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...