uvalive 3716

题意:有两个长度是n的序列,找出一个[l,r]的区间,这个区间内有不超过%p的数满足A[i] != B[i],问区间长度最长是多少。

题解:先扫一遍把每个字母从开头到现在的序列内不同字母的比例计算出来,然后按不同字母比例从大到小排个序,再扫一遍,更新最大长度。

#include 
#include 
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;
}


你可能感兴趣的:(ACM-高效算法)