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