Kirinriki HDU

来源:互联网 发布:深澜软件下载 编辑:程序博客网 时间:2024/06/08 17:30

比赛的时候直接就想到了尺取法,然后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;}
原创粉丝点击