[ICPC 2022 Nanjing R] 完美回文题解

 题目描述

给定长度为 n 的字符串 S=s0​s1​⋯sn−1​,令 f(S,d) 表示将 S 左移 d 次后获得的字符串。也就是说 f(S,d)=s(d+0)modn​s(d+1)modn​⋯s(d+n−1)modn​。称 S 为完美回文,若对于所有非负整数 d,f(S,d) 都是回文串。

给定长度为 n 的仅由小写英文字母组成的字符串 A=a0​a1​⋯an−1​,您可以对 A 进行任意次以下操作(包括零次):选择整数 i 满足 0≤i<n 并将 ai​ 改为任何小写英文字母。

求将 A 变为完美回文的最少操作次数。

称长度为 n 的字符串 P=p0​p1​⋯pn−1​ 是回文串,若对于所有 0≤i<n 有 pi​=pn−1−i​。

输入格式

有多组测试数据。第一行输入一个整数 T 表示测试数据组数,对于每组测试数据:

第一行输入一个仅由小写英文字母构成的字符串 a0​a1​⋯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;
}

posted @ 2025-10-10 16:25  bz02_2023f2  阅读(3)  评论(0)    收藏  举报  来源