社区讨论
大佬求调!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 条回复,欢迎继续交流。
正在加载回复...