2017多校六 1008题 hdu 6103 Kirinriki 尺取法

来源:互联网 发布:二手车众筹源码 编辑:程序博客网 时间:2024/05/16 18:16

题目链接


题意:

给定一个串 s,要找其两个子串 A, B, 使得在满足 cost <= m 的前提下,子串长度取到最大值。

cost 的定义为 sigma(i = 0 ~ n - 1) (abs(A[i] - B[n - 1 - i])).


思路:

枚举中心点向两边扩展。

对于每一个确定的中心点(左边子串的右端点,右边子串的左端点),运用尺取法判断 cost <= m 的前提下子串能取到的最大长度,这就是一个很常规的尺取的题目了:固定一个端点移动另一个直到不满足条件,求一个值,再将固定的端点移动一格,然后继续移动另一个端点直到不满足条件,这样周而复始...

又因为考虑到最终答案的两个子串之间可能相隔奇数个位置,也可能相隔偶数个位置,因此枚举时就要枚举两种情况。


Code:

#include <bits/stdc++.h>#define maxn 5010char s[maxn];int n;inline int max(int a, int b) { return a > b ? a : b; }int count1(char* s) {    int len = strlen(s), ret = 0;    for (int i = 0; i < len - 1; ++i) {        int l1, r1, l2, r2, sum = 0, ans = 0;        l1 = r1 = i, l2 = r2 = i + 1;        while (true) {            bool flag = false;            while (l1 >= 0 && r2 < len) {                sum += abs(s[l1] - s[r2]);                if (sum > n) break;                --l1, ++r2;            }            ans = max(ans, r1 - l1);            if (sum <= n) break;            sum -= abs(s[r1--] - s[l2++]);            --l1, ++r2;        }        ret = max(ret, ans);    }    return ret;}int count2(char* s) {    int len = strlen(s), ret = 0;    for (int i = 1; i < len - 1; ++i) {        int l1, r1, l2, r2, sum = 0, ans = 0;        l1 = r1 = i - 1, l2 = r2 = i + 1;        while (true) {            bool flag = false;            while (l1 >= 0 && r2 < len) {                sum += abs(s[l1] - s[r2]);                if (sum > n) break;                --l1, ++r2;            }            ans = max(ans, r1 - l1);            if (sum <= n) break;            sum -= abs(s[r1--] - s[l2++]);            --l1, ++r2;        }        ret = max(ret, ans);    }    return ret;}void work() {    scanf("%d%s", &n, s);    printf("%d\n", max(count1(s), count2(s)));}int main() {    int T;    scanf("%d", &T);    while (T--) work();    return 0;}


就是这个尺取法写起来有点绕Orz.调了大半天...脑子太糊涂...还是太弱了

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 注册战网手机号被使用怎么办 电信充值卡密码刮花了怎么办 油卡充值卡密码刮花了怎么办 电费充值卡密码刮花了怎么办 手机充值卡密码刮坏了怎么办 办中石化油卡怎么办 移动代充q币没到怎么办 电信手机话费充多了怎么办 微信钱包提现提错银行卡怎么办 qq余额提现不了怎么办 qq钱包充错话费了怎么办 苹果账户扣了钱怎么办 苹果平板冲不进去电怎么办 qq红包输了钱怎么办 qq红包实名认证没有银行卡怎么办 扣扣红包发不了怎么办 qb充错账号了怎么办 q币冲错了号了怎么办 微信qb冲错号码怎么办 微信qb冲错了怎么办 qb冲到小号了怎么办 无意中充了q币怎么办 在绝地求生里打不开充值页面怎么办 电脑版迷你世界打不开怎么办 电脑的腾讯视频打不开怎么办 好多程序连不上网了怎么办 掌游宝炉石传说卡组复制不了怎么办 花呗不能充话费怎么办 想用话费充王者怎么办 苹果6s激活出错怎么办 联通话费充多了怎么办? 电信宽带充值充到别人账号了怎么办 未实名的支付宝钱转不出来怎么办 手机打游戏闪屏怎么办 支付宝手机冲错怎么办 手机停用了支付宝充值码怎么办 苹果手机桌面上找不到支付宝怎么办 苹果手机支付宝找不到了怎么办 微信上充话费没到账怎么办 冲q币不到账怎么办 支付宝冲话费没到帐怎么办