CodeForces 1332-C K-Complete Word(区段回文串)
CodeForces 1332-C K-Complete Word(区段回文串)
https://codeforces.com/contest/1332/problem/C
题意:
给一个长度为n的字符串,让你将它修改成n/k段相等的回文段,求最小的修改次数。
思路:
我们先将字符串按k长度分区:
{XXX...XX}{XXX...XX}...{XXX...XX}
最后要求是回文串,所以每个分区都是完全一样的回文串,记录长度为[k/2]的分区的每个位置每个字母出现的次数就可以了,然后贪心,出现次数最多的字母不用改,其它字母全改掉。
#include <bits/stdc++.h> typedef long long LL; const int INF=0x3f3f3f3f; const double eps =1e-8; const int mod=1e8; const int maxn=2e5+10; using namespace std; int a[maxn][30]; char str[maxn]; int main() { #ifdef DEBUG freopen("sample.txt","r",stdin); #endif int T; scanf("%d",&T); while(T--) { int n,k; scanf("%d %d %s",&n,&k,str); for(int i=0;i<n;i++) a[min(i%k,k-i%k-1)][str[i]-'a']++; int ans=0; for(int i=0;i<k;i++) { int num=0; int MAX=0; for(int j=0;j<26;j++) { num+=a[i][j]; MAX=max(MAX,a[i][j]); a[i][j]=0; } ans+=num-MAX; } printf("%d\n",ans); } return 0; }
-