[ICPC 2022 Nanjing R] 完美回文题解
题目描述
给定长度为 n 的字符串 S=s0s1⋯sn−1,令 f(S,d) 表示将 S 左移 d 次后获得的字符串。也就是说 f(S,d)=s(d+0)modns(d+1)modn⋯s(d+n−1)modn。称 S 为完美回文,若对于所有非负整数 d,f(S,d) 都是回文串。
给定长度为 n 的仅由小写英文字母组成的字符串 A=a0a1⋯an−1,您可以对 A 进行任意次以下操作(包括零次):选择整数 i 满足 0≤i<n 并将 ai 改为任何小写英文字母。
求将 A 变为完美回文的最少操作次数。
称长度为 n 的字符串 P=p0p1⋯pn−1 是回文串,若对于所有 0≤i<n 有 pi=pn−1−i。
输入格式
有多组测试数据。第一行输入一个整数 T 表示测试数据组数,对于每组测试数据:
第一行输入一个仅由小写英文字母构成的字符串 a0a1⋯an−1(1≤n≤105)。
保证所有数据中字符串长度之和不超过 106。
输出格式
每组数据输出一行一个整数表示将 A 变为完美回文的最少操作次数。
输入输出样例
输入 #1复制
2 abcb xxx
输出 #1复制
2 0
说明/提示
对于第一组样例数据,可以将第一和第三个字符变为 b,这样字符串将变为 bbbb。容易发现对于所有非负整数 d,f(“bbbb”,d)=“bbbb” 且 bbbb 是回文串,因此 bbbb 是完美回文。这些变化需要消耗 2 次操作,可以证明这是最少需要的操作次数。
对于第二组样例数据,xxx 已经是完美回文,因此无需任何操作。
思路
注意到必定改成相同字符,直接统计每种字符数量,贪心即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long t,f[27],lk=0;
char s[1000006];
int main(){
cin>>t;
while(t--){
cin>>s;
long long u=strlen(s);
for(int i=0;i<u;i++){
f[(long long)(s[i]-'a'+1)]++;
}
lk=0;
for(int i=1;i<=26;i++){
lk=max(f[i],lk);
}
cout<<u-lk<<endl;
for(int i=0;i<u;i++){
s[i]=' ';
}
for(int i=1;i<=26;i++){
f[i]=0;
}
}
return 0;
}

浙公网安备 33010602011771号