codeforces 676C Vasya and String 前缀数组+二分查找
2016-05-28 10:22
471 查看
C. Vasya and String
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
High school student Vasya got a string of length n as a birthday present. This string consists of letters 'a'
and 'b' only. Vasya denotesbeauty of the string as the maximum length of a substring (consecutive
subsequence) consisting of equal letters.
Vasya can change no more than k characters of the original string. What is the maximum beauty of the string he can achieve?
Input
The first line of the input contains two integers n and k (1 ≤ n ≤ 100 000, 0 ≤ k ≤ n) —
the length of the string and the maximum number of characters to change.
The second line contains the string, consisting of letters 'a' and 'b'
only.
Output
Print the only integer — the maximum beauty of the string Vasya can achieve by changing no more than k characters.
Examples
input
output
input
output
Note
In the first sample, Vasya can obtain both strings "aaaa" and "bbbb".
In the second sample, the optimal answer is obtained with the string "aaaaabaa" or with the string "aabaaaaa".
首先用一个整形数组a和b分别存放字符串s的前缀,使得a[i] - a[j - 1]为[i, j]区间上'a'的个数(仅仅是个数,不一定连续,b同理)
然后就查找能用至多k个元素填充使连续串最长的区间[i,l]
扫描字符串中的每个位置i,计算k有能力填充的以i为起点的最长的区间[i,l]的长度
如果对于每个位置i,在找区间[i,l]时用for循环遍历的话肯定会超时,采用二分查找将复杂度降到nlog(n)
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
High school student Vasya got a string of length n as a birthday present. This string consists of letters 'a'
and 'b' only. Vasya denotesbeauty of the string as the maximum length of a substring (consecutive
subsequence) consisting of equal letters.
Vasya can change no more than k characters of the original string. What is the maximum beauty of the string he can achieve?
Input
The first line of the input contains two integers n and k (1 ≤ n ≤ 100 000, 0 ≤ k ≤ n) —
the length of the string and the maximum number of characters to change.
The second line contains the string, consisting of letters 'a' and 'b'
only.
Output
Print the only integer — the maximum beauty of the string Vasya can achieve by changing no more than k characters.
Examples
input
4 2 abba
output
4
input
8 1 aabaabaa
output
5
Note
In the first sample, Vasya can obtain both strings "aaaa" and "bbbb".
In the second sample, the optimal answer is obtained with the string "aaaaabaa" or with the string "aabaaaaa".
首先用一个整形数组a和b分别存放字符串s的前缀,使得a[i] - a[j - 1]为[i, j]区间上'a'的个数(仅仅是个数,不一定连续,b同理)
然后就查找能用至多k个元素填充使连续串最长的区间[i,l]
扫描字符串中的每个位置i,计算k有能力填充的以i为起点的最长的区间[i,l]的长度
如果对于每个位置i,在找区间[i,l]时用for循环遍历的话肯定会超时,采用二分查找将复杂度降到nlog(n)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 100000; char s[maxn + 10]; int a[maxn + 1], b[maxn + 10]; int n, k; bool check(int l, int r) { if (a[r] - a[l - 1] <= k || b[r] - b[l - 1] <= k) { return true; } return false; } int main() { cin >> n >> k; scanf("%s", s + 1); for (int i = 1; i <= n; i++) { a[i] = a[i - 1] + (s[i] == 'a'); b[i] = b[i - 1] + (s[i] == 'b'); } int ans = -1; for (int i = 1; i <= n; i++) { int l = i, r = n; while (l <= r) { int mid = (l + r) >> 1; check(i, mid) ? l = mid + 1 : r = mid - 1; } ans = max(ans, r - i + 1); } cout << ans << endl; return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 快速排序里的学问:从猜数字开始
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002