codeforces 676C Vasya and String 贪心 尺取法
2016-05-26 22:32
435 查看
题目链接:http://codeforces.com/contest/676/problem/C
题意:
给出一个长度为n的字符串,只有字符'a'和'b'。最多能改变k个字符,即把'a'变成'b'或把'b'变成'a'。
问改变后的最长连续相同字符的字串长度为多少。
思路:
因为要使连续的相同字符最多,所以改变的字符肯定相同的,靠近的。
比如17 3
aaabbaabaaaabbbaa
如果改变b,那么改变的肯定是第1,2,3的b或第2,3,4的b或第3,4,5的b.....
所以然后就尺取法做就可以了。
题意:
给出一个长度为n的字符串,只有字符'a'和'b'。最多能改变k个字符,即把'a'变成'b'或把'b'变成'a'。
问改变后的最长连续相同字符的字串长度为多少。
思路:
因为要使连续的相同字符最多,所以改变的字符肯定相同的,靠近的。
比如17 3
aaabbaabaaaabbbaa
如果改变b,那么改变的肯定是第1,2,3的b或第2,3,4的b或第3,4,5的b.....
所以然后就尺取法做就可以了。
#include <bits/stdc++.h> using namespace std; int n, k; #define maxn 100010 char s[maxn]; int len; struct Node { int l, r; void clear() {l = 0; r = 0;} }a[maxn]; int cnt; int slove(char c) { int sum = 0; cnt = 0; if(s[0] == c) {a[cnt].l = 0; cnt++; sum = 0;} else sum = 1; for(int i = 1; i < len; i++) { if(s[i] == c){ a[cnt].l = sum; sum = 0; cnt++;} else sum++; } int tcnt = cnt-1; if(s[len-1] == c) {a[tcnt].r = 0; tcnt--; sum = 0;} else sum = 1; for(int i = len-2; i >= 0; i--) { if(s[i] != c) sum++; else if(s[i] == c) {a[tcnt].r = sum; sum = 0; tcnt--;} } int L = 0, R = k-1; int ans = 0; for(int i = L; i <= min(R, cnt-1); i++) ans += a[i].l; ans += a[min(R, cnt-1)].r; ans += min(k, cnt); sum = ans; while(L <= cnt-k-1) { sum -= a[L].l; sum += a[R+1].r; L++; R++; ans = max(sum, ans); } return ans; } int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); while(~scanf("%d%d", &n, &k)) { scanf("%s", s); len = strlen(s); if(k == 0) { int ans = 0, sum = 0; char prec = '#'; for(int i = 0; i < len; i++) { if(s[i] != prec) {prec = s[i]; ans = max(ans, sum); sum = 1;} else sum++; } ans = max(ans, sum); printf("%d\n", ans); continue; } int sum = 0; for(int i = 1; i < len; i++) { if(s[i] == s[0]) sum++; } if(sum == len-1) printf("%d\n", len); else printf("%d\n", max(slove('a'), slove('b'))); } return 0; }
相关文章推荐
- LeetCode小试
- 编码问题
- 思迅代理商网站模板
- XML——XML介绍和基本语法
- POJ 3667 Hotel (线段树区间合并)
- Android原生Json解析
- 字典(trie)树的应用与实现
- JAVA DOM4j解析XML数据到自定义javabean
- Handler与HandlerThread、IntentService源码解析
- 管道流PipedInputStream,PipedInputStream、操作(字节数组,字符数组,字符串)流
- JAVA DOM4j解析XML数据到自定义javabean
- 第五次课总结及思考
- 循环队列基本实现
- 第二次冲刺周期08
- 光流法小结
- 安卓入门--SqliteOpenHepler详解
- LeetCode-300.Longest Increasing Subsequence
- 测试C++程序运行的时间
- Java数组详解
- IEnumerable和IEnumerator介绍和区别