题意:
找到两个不相交的子串,使其满足题中给定关系
思路:
将字符串从后往前逐次插入,这样可以每次移动以O1的时间复杂度算出新插入后的ans值,之后再从前往后插入。这样可以遍历到所有的可能情况
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=20005;
char s[maxn];
int m,len;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int m;
scanf("%d",&m);
scanf("%s",s);
int ans=0;
int len=strlen(s);
for(int i=1;i<len;i++)
{
int res=0,t=0,l=0;
for(int j=0;j<(i+1)/2;j++)
{
res+=abs(s[j]-s[i-j]);
if(res<=m)
{
t++;
ans=max(ans,t);
}
else
{
res-=abs(s[j]-s[i-j]);
res-=abs(s[l]-s[i-l]);
l++,t--,j--;
}
}
}
reverse(s,s+len);
for(int i=1;i<len;i++)
{
int res=0,t=0,l=0;
for(int j=0;j<(i+1)/2;j++)
{
res+=abs(s[j]-s[i-j]);
if(res<=m)
{
t++;
ans=max(ans,t);
}
else
{
res-=abs(s[j]-s[i-j]);
res-=abs(s[l]-s[i-l]);
l++,t--,j--;
}
}
}
printf("%d\n",ans);
}
}