P11279 「GFOI Round 2」Abstract String Basic
题目背景
English statement. You must submit your code at the Chinese version of the statement.
题目描述
Charlie 正在上一门叫做《抽象字符串基础》的课。
定义 3.1: 对于两个长度相同的小写字母串 S S S 和 T T T,定义它们的相似度为它们相同的对应位置个数。形式化地,设 ∣ S ∣ = ∣ T ∣ = n |S|=|T|=n ∣S∣=∣T∣=n,则 S S S 和 T T T 的相似度 ψ ( S , T ) = ∑ i = 1 n ∑ j = 1 n [ i = j ] [ S i = T j ] \psi(S,T)=\sum\limits_{i=1}^n\sum\limits_{j=1}^n[i=j][S_i=T_j] ψ(S,T)=i=1∑nj=1∑n[i=j][Si=Tj]。
引理 3.1: 对于任意小写字母串 S S S,存在唯一的小写字母串 T T T,使得 ψ ( S , T ) \psi(S,T) ψ(S,T) 最大化。
引理 3.1 的证明:……
Charlie 逐渐开始神游,在纸上写写画画。忽然,他想到定义 S S S 和 T T T 的不相似度为有几对不同位置上的字符不同,即 ψ ~ ( S , T ) = ∑ i = 1 n ∑ j = 1 n [ i ≠ j ] [ S i ≠ T j ] \tilde\psi(S,T)=\sum\limits_{i=1}^n\sum\limits_{j=1}^n[i\neq j][S_i\neq T_j] ψ~(S,T)=i=1∑nj=1∑n[i=j][Si=Tj]。这个清奇的定义让 Charlie 一下子清醒了,他想到,什么样的小写字母串 T T T 能够最大化 S S S 和 T T T 的不相似度呢?
注: [ x ] [x] [x] 的方括号为艾弗森括号,其定义为:若条件表达式 x x x 为真则 [ x ] [x] [x] 取值为 1 1 1,否则 [ x ] [x] [x] 取值为 0 0 0。
输入格式
第一行包含一个正整数 n n n。
第二行包含一个长度为 n n n 的字符串 S S S,保证 S S S 中仅含小写字母。
输出格式
输出一行小写字母字符串 T T T,表示你的答案。你需要使得 S S S 与 T T T 的不相似度最大化。如果有多种答案,输出任意一种均可。
输入输出样例 #1
输入 #1
9
cbbccxxxx
输出 #1
godfather
输入输出样例 #2
输入 #2
26
abcdefghijklmnopqrstuvwxyz
输出 #2
abcdefghijklmnopqrstuvwxyz
输入输出样例 #3
输入 #3
28
aabcdefghijklmnopqrstuvwxyzz
输出 #3
cybcdefghijklmnopqrstuvwxycy
说明/提示
【样例解释 #1】
当 T = godfather T=\texttt{godfather} T=godfather 时, ψ ~ ( S , T ) = 72 \tilde\psi(S,T)=72 ψ~(S,T)=72,取到最大值。注意答案可能不止一种。
【数据范围】
本题采用捆绑测试。
子任务编号 | n ≤ n\le n≤ | 特殊性质 | 分值 |
---|---|---|---|
0 0 0 | 28 28 28 | 是样例 | 0 0 0 |
1 1 1 | 4 4 4 | 无 | 20 20 20 |
2 2 2 | 1 0 6 10^6 106 |
S
S
S 中不包含字符 z | 20 20 20 |
3 3 3 | 1 0 3 10^3 103 | 无 | 20 20 20 |
4 4 4 | 1 0 6 10^6 106 | 无 | 40 40 40 |
对于所有数据,满足:
- 1 ≤ n ≤ 1 0 6 1 \leq n \leq 10^6 1≤n≤106;
- S S S 中仅包含小写字母。
C++实现
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int ans[140];
int main(){
cin>>n;
cin>>s;
s=’ '+s;
for(int i=1;i<=n;i++){
ans[s[i]]++;
}
char min1=‘9’;
int min2=1e9;
for(int i=‘a’;i<=‘z’;i++){
if(ans[i]<min2){
min2=ans[i];
min1=i;
}
}
for(int i=1;i<=n;i++){
int now1=ans[s[i]]-1;
if(now1<min2){
cout<<(char)s[i];
}
else{
cout<<min1;
}
}
cout<<endl;
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容