题意:
判断一个字符串最多修改几个字符可以变成 的。 指的是:
- 该字符串为回文串;
- 该字符串的周期为 。
如果要满足以上两个条件就得满足每一个长度为
的小段是回文的。
把所以必须相同的字符位置合并,然后找到这些位置中出现最多次的字符。
AC代码:
const int N = 2e5 + 10;
int ans, res, tmp, maxn;
int n, k;
int cnt[N][26];
char s[N];
int main()
{
int t;
sd(t);
while (t--)
{
sdd(n, k);
ss(s + 1);
rep(i, 1, k)
mem(cnt[i], 0);
rep(i, 1, n)
{
if (i % k == 0)
cnt[k][s[i] - 'a']++;
else
cnt[i % k][s[i] - 'a']++;
}
ans = 0;
rep(i, 1, k / 2)
{
rep(j, 0, 25)
{
cnt[i][j] += cnt[k + 1 - i][j];
}
}
rep(i, 1, k / 2)
{
maxn = 0;
rep(j, 0, 25)
{
maxn = max(maxn, cnt[i][j]);
}
ans += maxn;
}
if (k & 1)
{
maxn = 0;
rep(i, 0, 25)
{
maxn = max(maxn, cnt[k / 2 + 1][i]);
}
ans += maxn;
}
pd(n - ans);
}
return 0;
}