2017 Multi-University Training Contest - Team 6 HDU 6103 Kirinriki (尺取法)
2017-08-17 21:29
495 查看
2017 Multi-University Training Contest - Team 6 HDU 6103 Kirinriki (尺取法)
题目链接:HDU 6103 Kirinriki
题目大意:
给一个字符串s,和一个值m.
定义disA,B=∑i=0n−1|Ai−Bn−1−i| .
在s串中找出最长的AB子串使得dis{A,B}≤m。
解题思路:
比赛的时候这道题给的数据是∑|S|≤20000。 就在想O(nlogn)的复杂度, 不敢写O(n2)的, 最后实在没办法写了O(n2)的, 没想到官方题解就是让用O(n2)做。。。
首先可以枚举一个对称点, 然后用尺取法往外扩张,考虑两种情况, 中间的留一个字母和中间不留字母。
代码:
/********************************************** *Author* :ZZZZone *reated Time* : 2017/8/11 13:47:16 *ended Time* : 2017/8/11 14:07:47 *********************************************/ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include < e2d9 queue> #include <set> #include <map> #include <string> #include <cmath> #include <cstdlib> #include <ctime> #include <stack> using namespace std; typedef pair<int, int> PII; typedef long long LL; typedef unsigned long long ULL; const int MaxN = 5e3; int T, m, ans, len; char s[MaxN + 5]; void check(int p){ int r = p; int tot = 0; for(int i = p; i >= 0; i--){ int tmp = 2 * p + 1; if(tmp - i >= len) break; tot += abs(s[i] - s[tmp - i]); while(tot > m && r >= i){ tot -= abs(s[r] - s[tmp - r]); r--; } ans = max(ans, r - i + 1); } tot = 0, r = p - 1; for(int i = p - 1; i >= 0; i--){ int tmp = 2 * p; if(tmp - i >= len) break; tot += abs(s[i] - s[tmp - i]); while(tot > m && r >= i){ tot -= abs(s[r] - s[tmp - r]); r--; } ans = max(ans, r - i + 1); } } int main() { scanf("%d", &T); while(T--){ scanf("%d", &m); scanf("%s", s); ans = 0; len = strlen(s); for(int i = 0; i < len; i++) check(i); printf("%d\n", ans); } return 0; }
相关文章推荐
- HDU-6103 Kirinriki - 2017 Multi-University Training Contest - Team 6(尺取)
- 2017 Multi-University Training Contest - Team 6: Kirinriki
- 2017 Multi-University Training Contest - Team 6 1008 Kirinriki【思维题 + 尺取】
- 2017 Multi-University Training Contest - Team 6:1008&hdu6103、Kirinriki
- 2017 Multi-University Training Contest - Team 6 1008 Kirinriki
- 【2017 Multi-University Training Contest - Team 6】Kirinriki
- 2017 Multi-University Training Contest - Team 6 Kirinriki
- 2017 Multi-University Training Contest - Team 6 Kirinriki
- hdu 6041 I Curse Myself [2017 Multi-University Training Contest - Team 1]
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
- hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )
- hdu 6069 Counting Divisors(约数个数)(2017 Multi-University Training Contest - Team 4 )
- hdu 6070 Dirt Ratio(二分+线段树)(2017 Multi-University Training Contest - Team 4 )
- hdu 6071 Lazy Running(优先队列+dijkstra)(2017 Multi-University Training Contest - Team 4)
- hdu 6073 Matching In Multiplication(2017 Multi-University Training Contest - Team 4 )
- 2017 Multi-University Training Contest - Team 4 HDU 6070 Dirt Ratio (二分+ 线段树)
- hdu 6034 Balala Power!(贪心)( 2017 Multi-University Training Contest - Team 1 )(无耻之sort)
- 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】
- 2017 Multi-University Training Contest - Team 9 待补 hdu 6161 ~6170
- 2017 Multi-University Training Contest - Team 1:Add More Zero (hdu 6033)