A.Update
全局替换功能是一个十分好用的功能。使用这个功能,你可以轻松地在编辑器中对字符串进行修改。 Iris 是一只可爱的猫猫,她用爪子在 oql 的键盘上胡乱敲了若干次,刚好形成了一个仅由小写字母组成 的字符串。 oql 特别喜欢 i 这个字母,他想把这个字符串中的所有字母都变成 i,并准备进行如下操作若干次(也 有可能一次都不用操作): • 选择两个 a ~ z的字母 x, y,将字符串中所有的 x 全部同时替换成 y。 oql 想知道,至少要用多少次操作才能把所有字符都变成 i。
注释:只要把要换的种类记一下即可(set最方便了)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 200010
int n,m,a[N];
map<int,int> q;
void cb(){
string s;cin>>s;
map<char,int>mp;
int ans=0;
for(int i=0;i<s.size();i++){
if(!mp[s[i]]&&s[i]!='i')ans++;
mp[s[i]]++;
}
cout<<ans<<endl;
}
signed main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int t;t=1;
while(t--)cb();
return 0;
}
K. Welcome
输出即可
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 200010
int n,d,h,a[N],ans=-1;
map<int,int> q;
void cb(){
cout<<"HBCPC2024";
}
signed main(){
int t;t=1;
while(t--)cb();
return 0;
}
C. Goose Goose Duck
Iris 有 n 个喜欢玩鹅鸭杀的朋友,编号为 1 ∼ n。 假期的时候,大家经常会在群里问有没有人玩鹅鸭杀,并且报出现在已经参与的人数。 但是每个人对于当前是否加入游戏都有自己的想法。 具体的来说,对于第 i 个人,如果当前已经加入游戏的人数处于区间 [li , ri ] 之间,那 ta 就会愿意加入游 戏。 你认为参与游戏的人越多,游戏将会越有趣,所以你决定给大家安排一个加入顺序,使得加入游戏的人 数最多。
注释:用小根堆写首先先推入判断l<r再记录这个下标,最后输出即可;
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,a[N];
#define P pair<int,int>
vector<P> e[N];
void cb(){
cin>>n;
priority_queue<P,vector<P>,greater<P>>q;
vector<int> ans;
for(int i=1;i<=n;i++){
int l,r;cin>>l>>r;
e[l].push_back({r,i});
}
for(int i=1;i<=n;i++){
for(auto w:e[i-1])q.emplace(w);
while(!q.empty()&&q.top().first<i-1)q.pop();
if(q.empty())break;
ans.push_back(q.top().second);
q.pop();
}
cout<<ans.size()<<'\n';
for(auto x:ans)cout<<x<<' ';
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int t;t=1;
while(t--)cb();
return 0;
}
I. Subnet Iris
刚刚学习了关于 IPv4 子网的知识。 现在,给定一个子网和若干 IP 地址,请你帮 Iris 判断每一个地址是否属于这个子网。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
#define P pair<int,int>
using ll=long long;
const int mod=1e6+3;
int zi_num[5],cnt,ip_num[5],cnt2;
vector<P> e[N];
void cb(){
string zi;cin>>zi;
int net_len=0;
for(int i=0;i<zi.size();++i){
if(zi[i]=='.')cnt++;
else if(zi[i]=='/'){
for(int j=i+1;j<zi.size();++j){
net_len=net_len*10+zi[j]-'0';
}
break;
}
else zi_num[cnt]=zi_num[cnt]*10+zi[i]-'0';
}
int n;cin>>n;
int last=net_len%8,com=net_len/8;
while(n--){
cnt=0;cnt2=0;
memset(ip_num,0,sizeof ip_num);
string ip;cin>>ip;
for(int i=0;i<ip.size();++i){
if(ip[i]=='.')cnt2++;
else ip_num[cnt2]=ip_num[cnt2]*10+ip[i]-'0';
}
bool flag=true;
for(int i=0;i<com;++i){
if(ip_num[i]!=zi_num[i]){
flag=false;
break;
}
}
if(flag&&last){
for(int i=8;i>=(8-last);--i){
if((ip_num[com]>>i)!=(zi_num[com]>>i)){
flag=false;
break;
}
}
}
if(flag)cout<<"YES\n";
else cout<<"NO\n";
}
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int t;t=1;
while(t--)cb();
return 0;
}
G. Bracelet oql
有若干个形如 00,01,11 的珠子,喜欢做手工的 oql 希望把他们串成一个手链,他精心设计了手链 的样式并绘出了图纸。 手链的样式可以抽象为一个由 0 和 1 组成的字符串 S,且首尾相接。 但是此时路过了一只叫 Iris 的猫猫,现在三种珠子分别只剩下 n, m, k 个了。 oql 很伤心,但是还是决定努力完成手链,至少完成手链的连续一部分,他想知道自己现在能完成的最 长连续部分的长度是多少。 显然,你不应该破坏珠子。不过,你可以翻转珠子,对于 00 和 11,翻转之后没有变化,对于 01,翻转 之后变为 10。
注释:先把成环的字符串再重复加一下即可解决这个麻烦,再用双指针去遍历条件,ans记录最大值。
#include<bits/stdc++.h>
using namespace std;
void cb(){
int ans[3]{};
for(int i=0;i<3;++i)cin>>ans[i];
string a;cin>>a;
int n=a.size();
a+=a;
int res=0;
for(int s=0;s<2;++s){
int cur[3]{ans[0],ans[1],ans[2]};
for(int i=s,j=s;i<n;i+=2){
while(j+2<=n+i&&cur[a[j]-'0'+a[j+1]-'0']){
cur[a[j]-'0'+a[j+1]-'0']--;
j+=2;
}
res=max(res,j-i);
cur[a[i]-'0'+a[i+1]-'0']++;
}
}
cout<<res;
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int t;t=1;
while(t--)cb();
return 0;
}