HUAWEI Programming Contest 2024 C - Many Replacement

 

普通遍历会超时 错误代码如下

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int N=200010;
int a[N];

int n,m;

int main()
{
  string s;
  
  cin>>n;
  cin>>s;
  cin>>m;
  while(m--)
  {
    char op,om;
    cin>>op>>om;
    for(int i=0;i<s.size();i++)
    {
      if(op==s[i]) s[i]=om;
    }
  
  }
  for(int i=0;i<s.size();i++) cout<<s[i];
  
}

之所以会超时 是因为 while循环里面又有一个for循环  执行m*n次很恐怖 

利用辅助数组优化成 m*26

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int N=200010;
int a[N];

int n,m;

int main()
{
  string s; 
  /*
  因为每次实际上只动了a到z这几个字母
  所以可以创建一个字符数组k先把a到z的每一个字母给记下来
  那么比如s=atcoder s中的a就对应 k中的a
  然后对k数组执行 m 次更改 比如 k中a变成了t 那么k[0]存的就是t
  然后遍历一遍s数组 依次输出 s中字母所对应的下标在k中对应的值
  

  */
  char k[26];//额外定义一个用来存a到z字符的数组
  for(int i=0;i<26;i++)
  {
    k[i]=char('a'+i);
  }
  cin>>n;
  cin>>s;
  cin>>m;
  while(m--)
  {
    char op,om;
    cin>>op>>om;
    for(int i=0;i<26;i++)
    {
      if(op==k[i]) k[i]=om;//
    }
  
  }
  for(int i=0;i<s.size();i++) 
    cout<<k[s[i]-'a']; //s[i]-'a'表示s中相对于a而言每个字母对应的下标
  
}

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值