At-abc342
AtCoder Beginner Contest 342 (已更新:C D)
C
似曾相识的经典映射题……而只会map的蒟蒻成功又被卡住了
简单的用map映射无法处理如r->a,a->r这样的多重映射,应该在先存下原本的信息,再作映射
写到这突然悟了……再改改
果然是没有悟一点(⊙﹏⊙),由于只处理26个字母,每次修改实时更新就行
错解
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
//const int N=1e2+5;
//int a[N];
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;cin>>n;
string s;cin>>s;
int q;cin>>q;
char c,d;
map<char,char>mp;
while(q--){
cin>>c>>d;
mp[c]=d;
}
for(auto i:s){
if(mp.count(i)) cout<<mp[i];
else cout<<i;
}
return 0;
}
正解
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
//const int N=1e2+5;
//int a[N];
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;cin>>n;
string s;cin>>s;
map<char,char>mp;
for(char i='a';i<='z';i++){
mp[i]=i;
}
int q;cin>>q;
char c,d;
while(q--){
cin>>c>>d;
for(char i='a';i<='z';i++){
if(mp[i]==c) mp[i]=d;
}
}
for(auto i:s){
cout<<mp[i];
}
return 0;
}
D
补充知识
唯一分解定理:任何一个大于1的整数n 都可以分解成若干个素因数的连乘积,如果不计各个素因数的顺序,那么这种分解是唯一的。
分析
完全平方数由于可以分解为两个完全相同的数的乘积,每个数又可以唯一的分解成质因子的乘积,因此完全平方数一定可以分解为质因子的偶数次的乘积,所以两数相乘要得到完全平方数的话,这两数的每个质因子的次方和都要是偶数
举个栗子:
12*48=576,576是完全平方数
12=2乘2乘3,48=3乘4乘4
两数质因子的次方和:
2:2次 3:2次 4:2次
而12*4=48,48不是完全平方数
12=2乘2乘3,4=2乘2
两数质因子的次方和:
2:4次 3:1次
所以我们可以只看每个数的为奇数次方的质因子,如果当前出现了n次,说明有(n-1)对的数的积满足每个质因子的次方和都是偶数,即完全平方数
操作
对于n个数,我们可以除去它的偶数次质因子,得到的是它的一次方的质因数的乘积x,再用cnt数组统计它的出现次数,ans+=cnt[x]-1(相当于加上此前x的出现次数)。此外,考虑到这个数可能是0,这时ans+=其它数的个数-已经遇到的为0的数的个数,所以应可以先声明tmp=n,数为0时ans+=tmp-1,tmp--;
如序列 0 1 3 2 0 7
第一次遇到0:ans+=5
第二次遇到0:ans+=4
如数本身就是完全平方数,当前出现了n次,对答案的贡献也是n-1,所以不用特判
代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int N=2e5+5;
int cnt[N];
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,x;cin>>n;
int tmp=n,ans=0;
while(n--){
cin>>x;
if(x==0){
ans+=tmp-1;
tmp--;
continue;
}
for(int i=2;i<=x/i;i++){
while(x%(i*i)==0){
x/=(i*i);
}
}
cnt[x]++;
ans+=cnt[x]-1;
}
cout<<ans;
return 0;
}
随机推荐
- [转帖]CTF -bugku-misc(持续更新直到全部刷完)
CTF -bugku-misc(持续更新直到全部刷完) https://www.cnblogs.com/cat47/p/11432475.html 1.签到题 点开可见.(这题就不浪费键盘了) CTF ...
- 【转帖】MySQL索引
数据表如何用索引快速查找 索引是 排好序的快速查找的数据结构 索引存储在文件系统中 索引的文件存储形式与存储引擎有关 索引数据结构:可以是二叉树.红黑树.Hash表.B-Tree.B+Tree 1.二 ...
- 【转帖】linux 调优篇 :硬件调优(BIOS配置)* 壹
一. 设置内存刷新频率为Auto二. 开启NUMA三. 设置Stream Write Mode四. 开启CPU预取配置五. 开启SRIOV六. 开启SMMU 通过在BIOS中设置一些高级选项,可以有效 ...
- 根目录被赋予777 -R权限后的处理过程
解决某研发手残导致的系统宕机问题的处理过程 背景 2022.8.8 公司一台服务器出现了宕机的现象: 所有的人都无法远程, 都提示密码错误. 但是网络还是通的. 2022.8.12 出差前一天去了一趟 ...
- 为什么Kubernetes和容器与机器学习密不可分?
原文出自infosecurity 作者:Rebecca James 京东云开发者社区编译 当前,数字化转型的热潮在IT领域发展的如火如荼,越来越多的企业投身其中,机器学习和人工智能等现代技术的融合在公 ...
- Vue 中keep-alive组件将会被缓存
动态包裹哈 <keep-alive> <component :is="comName"></component> </keep-alive ...
- RC4加密技术探究:优缺点与实战应用
引言 在网络安全领域,加密技术一直是保障数据安全的重要手段.Rivest Cipher 4(简称RC4)作为一种对称加密算法,自20世纪80年代以来广泛应用于各种网络安全协议中.本文将详细分析RC4加 ...
- 强化学习从基础到进阶-案例与实践[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
强化学习从基础到进阶-案例与实践[1]:强化学习概述.序列决策.动作空间定义.策略价值函数.探索与利用.Gym强化学习实验 1.1 强化学习概述 强化学习(reinforcement learning ...
- 1.13 导出表劫持ShellCode加载
在Windows操作系统中,动态链接库DLL是一种可重用的代码库,它允许多个程序共享同一份代码,从而节省系统资源.在程序运行时,如果需要使用某个库中的函数或变量,就会通过链接库来实现.而在Window ...
- 1.6 编写双管道ShellCode
本文将介绍如何将CMD绑定到双向管道上,这是一种常用的黑客反弹技巧,可以让用户在命令行界面下与其他程序进行交互,我们将从创建管道.启动进程.传输数据等方面对这个功能进行详细讲解.此外,本文还将通过使用 ...