题目传送门
//题意: 给你一个模板串a和匹配串b,|a|<=|b|<=2e5,两个串都是01串。
于是,a串之于b串的匹配位置,就有|b|-|a|+1种
我们想问,对于所有的匹配位置,会产生的匹配差异总和是多少。
所以匹配差异,是指——
比如模板串是0011,匹配0101,对于所有'0' match '1' 或者'1' match '0 ',
都产生了1的匹配差异。即这个样例产生了2的匹配差异。
//解题思路:我们直接枚举a串的每个位置,它会对应出b串的一个匹配区间。
我们只要查看区间中有多少字符与其不同即可。
这个可以利用前缀和简单实现。
//复杂度:O(n+m)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
char s1[200010],s2[200010];
int dp[200010][2];
int main()
{
scanf("%s",s1);
scanf("%s",s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
for(int i=0; i<len2; i++)
{
dp[i][1] = dp[i-1][1]+(s2[i]=='1'?1:0);
dp[i][0] = dp[i-1][0]+(s2[i]=='0'?1:0);
}
ll ans=0;
for(int i=0; i<len1; i++)
{
int l = i;
int r = len2-(len1-i);
if(s1[i]=='1')ans+=dp[r][0]-dp[l-1][0];
else
ans+=dp[r][1]-dp[l-1][1];
}
printf("%I64d\n",ans);
return 0;
}