Kirinriki HDU - 6103多校6

比赛的时候直接就想到了尺取法,然后tle了。。。;
优化成O(n^2)之后。。又莫名RE;
游戏体验极差;
假设 A 一定在 B 左边,然后考虑A的起点和B的尾部,如果暂时不考虑长度不固定,我们每次查找都让长度尽可能长,那么,我们一定需要将 A的起点和B的尾部,然后获取 A 向右延伸,B 向左延伸对应位置的贡献;可以采用尺取法来进行A的起点和B的尾部向中间的推移,当 此时的dis值大于 m 时,我们向中间推移 A的起点和B的尾部即可。在这个尺取法的过程中,记录下来最大的 dis 值即可。
莫名re。。重打一边就对了。。。。;

#include<bits/stdc++.h>
using namespace std;
const int MAXN=5555;
char s[MAXN];
int nl,m,ans;
void solve()
{
    for(int i = 2; i <= nl; i++)
    {
        int q = i / 2,l = 0,n = 0,sum = 0;
        for(int j = 0; j < q; j++)
        {
           sum += abs(s[j] - s[i - j - 1]);
           if(sum <= m)
           {
                n++;
                ans = max(ans,n);
           }
           else
           {
                sum -= abs(s[l] - s[i - l - 1]);
                sum -= abs(s[j] - s[i - j - 1]);
                n--,j--,l++;
           }
        }
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %s",&m,s);
        nl = strlen(s),ans = 0;
        solve();
        reverse(s,s + nl);
        solve();
        printf("%d\n",ans);
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值