题意:有两个长度是n的序列,找出一个[l,r]的区间,这个区间内有不超过%p的数满足A[i] != B[i],问区间长度最长是多少。
题解:先扫一遍把每个字母从开头到现在的序列内不同字母的比例计算出来,然后按不同字母比例从大到小排个序,再扫一遍,更新最大长度。
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 150005;
struct C {
int fa, len;
}c[N];
int n, p;
char a[N], b[N];
bool cmp(C aa, C bb) {
if (aa.fa != bb.fa)
return aa.fa > bb.fa;
return aa.len < bb.len;
}
int main() {
while (scanf("%d%d", &n, &p) && n) {
scanf("%s%s", a + 1, b + 1);
int cnt = 0, res = 0;
c[0].fa = c[0].len = 0;
for (int i = 1; i <= n; i++) {
if (a[i] != b[i])
cnt++;
c[i].fa = cnt * 100 - i * p;
c[i].len = i;
}
sort(c, c + 1 + n, cmp);
for (int i = 1, j = c[0].len; i <= n; i++) {
if (j < c[i].len)
res = max(res, c[i].len - j);
else
j = c[i].len;
}
if (res > 0)
printf("%d\n", res);
else
printf("No solution.\n");
}
return 0;
}