hdu6103(尺取)

来自http://blog.csdn.net/yqdjl6/article/details/77100392

问题就是给你一个串,让你求两个连续的子串,使其ASCII的差的绝对值之和不大于m的情况下,使子串最长 
这道题用枚举中心点的方法, 依次向外扩展,直到不能扩展为止,取长度最大值,因为会遇到奇偶串的情况,所以要枚举两次


取中心点向外扩展的时候,当abs们之和大于m时,从最中心处开始删abs也就是比如abd cep,当发现加上a和p的abs和时大于m了,就把d和c的abs删掉

#include<bits/stdc++.h>
using namespace std;
using LL =int64_t;
const int INF=0x3f3f3f3f;
const int maxn=5005;
int m,sum=0,len;
char s[maxn];

void work(int x,int y) {
    int l=0,r=0,cnt=0;
    while(y+r<len&&x-r>=0) {//s[x-r]~s[x-l]和s[y+l]~s[y+r]比较
        if(cnt+abs(s[y+r]-s[x-r])<=m) {//先扩展r,再扩展l
            cnt+=abs(s[y+r]-s[x-r]);
            r++;
            sum=max(sum,r-l);
        }
        else {
            cnt-=abs(s[y+l]-s[x-l]);
            l++;
        }
    }
    return ;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T;
    cin>>T;
    while(T--){
        sum=0;
        cin>>m>>s;
        len=strlen(s);
        for(int i=0;i<len;i++) {//枚举两个子串的中心
            work(i,i+1);//因为存在奇偶长度的子串,所以要枚举两次
            work(i-1,i+1);
        }
        cout<<sum<<endl;
    }
    return 0;
}


 
 

/*****************************


这两天多加了两场比赛,有1614级,我们垫底,很惨,这些题都是从来没有接触过的

我不知道别的队伍做过这些题没有,如果没有,那就是思维的碾压了,天赋

感觉很失望,尤其是在这样天天刷题的情况,我敢说我们做题的时间一点都不少

大抵我的人生一直都感觉蛮艰难,小学艰难,初中艰难,高中艰难,上了大学,更艰难了

想来若是以后出国,会是另一番艰难

结婚,生小孩,抚养小孩,想想就可怕

艰难的在我这里的含义就是付出了同等的努力却收获的很少,一直都是看别人轻轻松松的样子(也许就只是看起来)

自己却从来没有这样的殊遇,每一步都要咬着牙坚持

唯一庆幸的是没有放弃

以前没有,现在不会,将来也不会


啊,我好想看到自己可以碾压别人的天赋啊,你在哪呢



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值