题目给出的条件是一些相等关系,很容易想到可以用并查集维护。要让每一个联通块都是相同的字母并且修改最少,肯定就是全部修改成出现最多的字母,暴力统计即可。
UPD:其实也不用并查集,相等的位置中间间隔的距离是固定的,直接跳就行了。
#include <bits/stdc++.h>
using namespace std;
const int N=51;
int n,f[N];
int tot[26];
class NewArenaPassword {
public:
int minChange( string oldPassword, int K );
};
int gf(int x){
return f[x]==x?x:f[x]=gf(f[x]);
}
int NewArenaPassword::minChange(string s, int K) {
n=s.size();
int ans=0;
for(int i=0;i<n;i++) f[i]=i;
for(int i=0,j=n-K;i<K;i++,j++){
int fx=gf(i),fy=gf(j);
f[fx]=fy;
}
for(int i=0;i<n;i++)
if (f[i]==i){
memset(tot,0,sizeof tot);
int sum=0,mx=0;
for(int j=0;j<n;j++)
if (gf(j)==i) tot[s[j]-'a']++,sum++;
for(int j=0;j<26;j++) mx=max(mx,tot[j]);
ans+=sum-mx;
}
return ans;
}