题意:首先定义了两个串之间的距离
然后给我们一个串让我们找到这个串中两个不重叠的最长子串(两子个串长度相同),满足两个子串的距离<=m
思路:由于两个串是不重叠的,所以我们首先可以枚举两个串的对称轴,但这时候我们又需要分为两种情况讨论
1.
2.
枚举完对称轴然后尺取法找最大长度就可以了
ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
const int maxn = 5010;
char a[maxn];
int num[maxn];
int m;
int solve(int len)
{
int s = 0, t = 0, ans = 0, sum = 0;
while (1)
{
while (sum + num[t] <= m && t < len)
{
sum += num[t];
ans = max(t - s + 1, ans);
t++;
}
sum -= num[s++];
if (s >= len) break;
}
return ans;
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int len, res = 0;
scanf("%d", &m);
scanf("%s", a);
len = strlen(a);
for (int i = 0; i <len; i++)
{
int cnt = 0;
for (int j = 1; j + i < len && i - j >= 0; j++) //枚举奇数情况
num[cnt++] = abs(a[j + i] - a[i - j]);
res = max(res, solve(cnt));
}
for (int i = 0; i <len; i++)
{
int cnt = 0;
for (int j = 1; j + i - 1 < len && i - j >= 0; j++) //枚举偶数情况
num[cnt++] = abs(a[j + i - 1] - a[i - j]);
res = max(res, solve(cnt));
}
printf("%d\n", res);
}
return 0;
}