题目链接:点击打开链接
给出2个字符串a, b. 问字符串b中和字符串a长度相同的子串对应01不同的有多少对.
若a, b两字符串长度相同, 则直接比较. 若字符串长度不同, 记录当前位置以前所有的0, 1个数, 最后累加得到答案.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
#include "stack"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
#include "list"
#include "string"
#include "cstdlib"
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 2e5 + 5;
char a[MAXN], b[MAXN];
ll ans, dp0[MAXN], dp1[MAXN];
int main(int argc, char const *argv[])
{
scanf("%s%s", a + 1, b + 1);
int len1 = strlen(a + 1), len2 = strlen(b + 1);
if(len1 == len2) {
for(int i = 1; i <= len1; ++i)
if(a[i] != b[i]) ans++;
}
else {
for(int i = len2; i >= 1; --i)
if(b[i] == '0') {
dp0[i] = dp0[i + 1] + 1;
dp1[i] = dp1[i + 1];
}
else {
dp1[i] = dp1[i + 1] + 1;
dp0[i] = dp0[i + 1];
}
for(int i = 1; i <= len1; ++i)
if(a[i] == '0') ans += dp1[i] - dp1[len2 - len1 + i + 1];
else ans += dp0[i] - dp0[len2 - len1 + i + 1];
}
printf("%lld\n", ans);
return 0;
}