专栏文章
abc418 赤石寄
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioez58w
- 此快照首次捕获于
- 2025/12/02 18:07 3 个月前
- 此快照最后确认于
- 2025/12/02 18:07 3 个月前
abc418赛后总结
A
题意
问字符串后缀是否为
tea。解法
sb题不需要解法
B
题意
计字符 中
t 开头 t 结尾的子串 中 t 个数为 ,问 。算法
暴力。
C
题意
有 种物品,每种 个。 次询问,问取最少多少物品必定可以拿到 个相同物品。
算法
官方题解什么 shi?看不懂。说说我自己对这题的理解。
抽屉原理,想取到 个就必须先取所有物品各 个(若物品数量小于 就取物品数量个)。
我们可以对 排序,这样更好处理。
因为 ,我们可以预处理每一个 。
设 为 中大于等于这个 的元素个数,则 。
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;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...