专栏文章
Sol abc418d
AT_abc418_d题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miobdm1l
- 此快照首次捕获于
- 2025/12/02 16:26 3 个月前
- 此快照最后确认于
- 2025/12/02 16:26 3 个月前
D
题意
给定长度为 的 串 。现有操作:对于一个 串 ,选定一个 ,若 ,则将 和 替换为 ,否则替换为 。
对于 串是否合规,当且仅当任意操作后 且 中只有一个 存在。
问 中有多少个合规的子串。
算法
一眼 。
设 为以第 个元素结尾的子串中合规的子串个数, 为以第 个元素结尾的子串中不合规的子串个数。
合规的子串处理后会变为 ,不合规的会变为 。
若第 位为 ,则它与以第 位结尾的任何一个合规子串结合都是合规的,反之则不合规。
同理,若第 位为 ,则它与以第 位结尾的任何一个合规子串结合都是不合规的,反之则合规。
综上所述:
此时答案为:
对应代码:
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=200010;
int n,dp1[N],dp0[N];
string s;
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>s;
s=' '+s;
for(int i=1;i<=n;i++){
if(s[i]=='1'){
dp1[i]=dp1[i-1]+1;
dp0[i]=dp0[i-1];
}
else{
dp1[i]=dp0[i-1];
dp0[i]=dp1[i-1]+1;
}
dp1[n+1]+=dp1[i];
}
cout<<dp1[n+1];
return 0;
}
还能再优化一小点。
因为以第 个元素结尾的子串共 个,则有 。
可推出 。
由此可省去一维。
所以 方程可化为:
此时答案为:
对应代码:
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=200010;
int n,dp[N];
string s;
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>s;
s=' '+s;
for(int i=1;i<=n;i++){
if(s[i]=='1')dp[i]=dp[i-1]+1;
else dp[i]=i-dp[i-1]-1;
dp[n+1]+=dp[i];
}
cout<<dp[n+1];
return 0;
}
然后没有了 qwq.
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...