abc418 赤石寄
abc418赛后总结
A
题意
问字符串后缀是否为 tea。
解法
sb题不需要解法
B
题意
计字符 t 开头 t 结尾的子串 t 个数为
算法
暴力。
C
题意
有
算法
官方题解什么 shi?看不懂。说说我自己对这题的理解。
抽屉原理,想取到
我们可以对
因为
设
D
题意
给定长度为
对于
问
算法
一眼
设
合规的子串处理后会变为
若第
同理,若第
综上所述:
此时答案为:
对应代码:
#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;
}
还能再优化一小点。
因为以第
可推出
由此可省去一维。
所以
此时答案为:
对应代码:
#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;
}