#include <bits/stdc++.h>
using namespace std; //先贴下我的62ms
const int MAXN = 200000+666;
char a[MAXN];
char b[MAXN];
int pre[MAXN];
int main(){
cin>>a>>b;
int la = strlen(a);
int lb = strlen(b);
long long ans = 0; //结果一定用long long以上的 仔细想想结果很大 - -
if(pre[0]=='1') pre[0]=1;
else pre[0] = 0;
int pre0[MAXN];
if(pre0[0]=='0') pre0[0] = 1;
else pre0[0] = 0;
for(int i=1;i<lb;i++){ //保存B串1和0在各个区间段的个数(前缀和)
if(b[i]=='0'){
pre0[i] = pre0[i-1]+1;
pre[i] = pre[i-1];
}else{
pre0[i] = pre0[i-1];
pre[i] = pre[i-1]+1;
}
}
for(int i=0;i<la;i++){ //遍历A串,0匹配1,1匹配0(A串中每个元素走的范围是【i,lb-la+i】
if(a[i]=='0'){
ans+=(pre[lb-la+i]-pre[i]+(b[i]-'0')) ;
}else{
int t;
if(b[i]=='0') t = 1;
else t = 0;
ans+=(pre0[lb-la+i]-pre0[i]+t); //我觉着我这种菜鸟看这个清晰,如果不懂这个公式,看下一个程序
}
}
cout<<ans<<endl;
return 0;
}
这个是15ms
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 222222;
char a[MAXN];
char b[MAXN];
int pre[MAXN];
int pre0[MAXN];
int main(){
scanf("%s%s",a+1,b+1);
int la = strlen(a+1);
int lb = strlen(b+1);
long long ans = 0;
pre[0] = pre0[0] = 0;
for(int i=1;i<=lb;i++){
if(b[i]=='0'){
pre0[i] = pre0[i-1]+1;
pre[i] = pre[i-1];
}else{
pre0[i] = pre0[i-1];
pre[i] = pre[i-1]+1;
}
}
for(int i=1;i<=la;i++){
if(a[i]=='0'){
ans+=(pre[lb-la+i]-pre[i-1]) ;
}else{
ans+=(pre0[lb-la+i]-pre0[i-1]);
}
}
cout<<ans<<endl;
return 0;
}
2028

被折叠的 条评论
为什么被折叠?



