字符串距离
题目:
给出两个相同长度的由字符
a
和b
构成的字符串,定义它们的距离为对应位置不同的字符的数量。如串”aab”
与串”aba”
的距离为2
;串”ba”
与串”aa”
的距离为1
;串”baa”
和串”baa”
的距离为0
。下面给出两个字符串S
与T
,其中S
的长度不小于T
的长度。我们用|S|
代表S
的长度,|T|
代表T
的长度,那么在S
中一共有|S|-|T|+1
个与T
长度相同的子串,现在你需要计算T
串与这些|S|-|T|+1
个子串的距离的和。
输入描述:
第一行包含一个字符串
S
。第二行包含一个字符串T
。S
和T
均由字符a
和b
组成,1 ≤ |T| ≤ |S| ≤105
。
输出描述:
输出对应的答案。
样例:
in: aab aba out: 2
in: aaabb bab out: 5
题解:
如果这个题死盯着字串弄是没有思路的,但是如果你盯着T
中的每一个字符看,就有思路了 ;
对于T
中的每一个字符,看清楚它会和S
中的哪些字母去比较,然后计算一下每一个字符对答案的贡献就行了,看下图:
T
中0位置的字符和S
中橙色的字符比较,……看图应该就明白了。
时间复杂度:O(n)。
这题题中给出了只有a
,b
两种字母,那有其他字母该怎么搞呢,其实一样的,只不过把代码中的a
, b
变量用一个长度为26
的数组代替就好了。具体的看看代码。
#include<algorithm>
#include<bitset>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#defineis_lower(c) (c >='a'&& c <='z')
#defineis_upper(c) (c >='A'&& c <='Z')
#defineis_alpha(c) (is_lower(c) ||is_upper(c))
#defineis_digit(c) (c >='0'&& c <='9')
#definemin(a, b) ((a) < (b) ? (a) : (b))
#definemax(a, b) ((a) > (b) ? (a) : (b))
#definePIacos(-1)
#defineIO
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
#defineFor(i, a, b) for (int i = a; i <= b; i++)
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
const ll inf = 0x3f3f3f3f;
const double EPS = 1e-10;
const ll inf_ll = (ll)1e18;
const ll maxn = 100005LL;
const ll mod = 1000000007LL;
const int N = 10000+5;
/*
题目:
给出两个相同长度的由字符 a 和 b
构成的字符串,定义它们的距离为对应位置不同的字符的数量。如串”aab”与串”aba”的距离为
2;串”ba”与串”aa”的距离为 1;串”baa”和串”baa”的距离为 0。下面给出两个字符串 S 与
T,其中 S 的长度不小于 T 的长度。我们用|S|代表 S 的长度,|T|代表 T
的长度,那么在 S 中一共有|S|-|T|+1 个与T长度相同的子串,现在你需要计算 T
串与这些|S|-|T|+1 个子串的距离的和。
输入描述:
第一行包含一个字符串 S。第二行包含一个字符串 T。S 和 T 均由字符 a 和 b 组成,1 ≤
|T| ≤ |S| ≤105 。
输出描述:
输出对应的答案。
样例:
in:
aab
aba
out:
2
in:
aaabb
bab
out:
5*/
char S[N],T[N];
int main() {
cin>>S>>T;
int lens = strlen(S);
int lent = strlen(T);
int a = 0, b = 0, ans = 0;
for(int i = 0; i< lens - lent +1; i++)
S[i] == 'a' ? a++ : b++;
for(int i = 0; i < lent; i++) {
ans += T[i] == 'a' ? b : a;
S[i] == 'a' ? a-- : b--;
S[i + lens - lent + 1] == 'a' ? a++ : b++;
}
cout << ans << endl;
}