Bootstrap

打卡信奥刷题(883)用C++信奥P11279[普及组/提高] 「GFOI Round 2」Abstract String Basic

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=1nj=1n[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=1nj=1n[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 1n106
  • 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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

;