CCF认证-202409-02 | 字符串变换

题目描述

本题涉及字符包括大小写字母(A-Z 和 a-z)、数字(0-9)和空格共 63 种。在这个字符集合上,小 P 定义了一个字符替换函数 f(ch),表示将字符 ch 替换为 f(ch)。 例如 f(a)=b 表示将 a 替换为 b,f(b)=0表示将 b 替换为 0。 进而可以将其扩展为字符串变换函数 F(s),表示对字符串 s 进行变换,将 s 中每个字符 ch 都替换为 f(ch)。

字符替换函数 f 可表示为 n 个字符对 (ch1​,ch2​),即 f(ch1)=ch2​。

  • n 个字符对中,ch1​ 两两不同,即不会出现同时定义了 f(a)=b 和 f(a)=0 的情况;

  • 未定义的 f(ch),可视为 f(ch)=ch,即字符 ch 保持不变;

  • 函数 f 为单射,即当 ch1≠ch2 时有 f(ch1)≠f(ch2),例如不会同时有 f(b)=0 和 f(0)=0(b 和 0 都被替换为 0)。

现给定初始字符串 s,试处理 m 个查询:每个查询包含一个正整数 k,询问对初始字符串 s 变换 k 次后的结果 Fk(s)。

输入格式

从标准输入读入数据。

输入共 n+4 行。

输入的第一行包含一个字符串,形如 #s#,即用两个井号字符 # 将初始字符串 s 囊括其中。

输入的第二行包含一个正整数 n,表示组成函数 ff 的字符对数;接下来 n 行每行输入一个形如 #xy# 的字符串,表示 f(x)=y。

输入的第 n+3 行包含一个正整数 m,表示查询的个数;下一行包含空格分隔的 m 个正整数 k1,k2,⋯,km​,表示 m 个查询。

输出格式

输出到标准输出。

输出共 m 行,依次输出 m 个查询的结果;输出时每行同样是一个形如 #s# 的字符串,即用两个井号把变换后的字符串 s 括起。

样例输入

#Hello World#
6
#HH#
#e #
# r#
#re#
#oa#
#ao#
3
1 2 3

样例输出

#H llarWaeld#
#HrlloeWo ld#
#Hella Warld#

子任务

前 6060 的测试数据保证初始字符串 s 仅包含小写字母,且输入的 nn 个字符对也皆为小写字母(即保证小写字母仅会被替换为小写字母);

前 8080 的测试数据保证查询数量 m≤10m≤10、变换次数 k≤100k≤100;

全部测试数据保证 0<n≤630<n≤63、0<m≤1030<m≤103、0<k≤1090<k≤109 且初始字符串 s 包含不超过 100 个字符。

提示

由于读入的字符串中包含空格字符,推荐使用按行读取的方式,避免读入时跳过空格(如 cin 直接读入字符串)。

C 语言:可以使用 fgets() 函数读入整行,fgets(s, count, stdin) 会从标准连续输入读入至多 count - 1 个字符,并存入字符数组 s,直到遇到换行符或文件末尾为止。在前一种情况下,s 结尾处会存有读入的换行符。也可使用 getchar() 函数逐个字符读入,如 char ch = getchar();,这种方法需手动判断是否到达行末,即返回值是否为 \n

C++:可以使用 std::getline() 函数读入整行:std::getline(std::cin, s) 会从标准输入读入字符,并存入字符串 std::string s 中,直到换行符或文件末尾为止。在前一种情况下,换行符会从标准输入中读出,但不会存入字符串 s 中。

Python:使用 input() 函数即可读入整行。

题解:

        刚看完题,就感觉给的单射一定能形成循环,否则当k是1e9肯定超时。

        开始解题,关于如何替换字符串,使用一个<char,char>的map记录单射,循环原串就可以得到转化一次后的新字符串。

        所以第一种解法就是蛮力求解,循环k,每循环一个就从头开始循环原串,输出,得到80分(前面的给的是真宽泛),时间效率O(N3)。

        想怎么优化,因为CCF给的空间达到了512M,所以空间非常充足,以空间换时间是很好的办法,于是有了第二种方法。建一个新的<int,string> 的map,先取得k的最大值,然后变换k次,每次把得到的string和次数放进map里,最后遍历一遍k输出string就可以了,得到80分,但是时间优化到了O(N2)。

        那怎么办呢,于是就再牺牲一下空间并考虑一下循环的事了。

        说到循环,很简单的方法就是记录循环的次数然后取模即可,但是你怎么知道循环从哪开始,题目也没说一定全部都是循环,所以从原串开始变换,并压入一个新的map并记录变换的次数(代码是用了一个vector记录,原理一样),然后当遇到重复的就去map里找,得到开始重复的次数,当k<=这个数就直接输出,当k>这个数时就取模后加上序号即可,得分90,时间O(N),但是仍然有两个数据集出现了奇怪的问题(还没搞明白)。

        但是对于解题,我们已经搞定了数据集最大的那几个,那就结合第二种和第三种方法,就成功得到了100啦!虽然很可耻……

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<map>
using namespace std;
typedef long long ll;

string s;
int n=0,i,j,t,t1;
string op[1001]={""};
int m=0;
int k[10001]={0};
vector <int> v;
map<char,char> mp;
map<int,string> mpp;
map<string ,int > maa;
vector <string > vt;
int maxk=0;

int cmp(int x,int y){
    return x<y;
}

main(){
    getline(cin,s);
    //cout << s << "\n";
    /*
    for(i=0;i<s.size();i++){
        mp[s[i]]=s[i];
    }
    */
    cin >> n;
    getchar();
    for(i=0;i<n;i++){
        getline(cin,op[i]);
        mp[op[i][1]]=op[i][2];
    }
    cin >> m;
    for(i=1;i<=m;i++){
        cin >> k[i];
        if(k[i]>maxk){
            maxk=k[i];
        }
        mpp[k[i]]="";
    }
    //cout << maxk << "\n";
    maa[s]=1;vt.push_back(s);
    //maxk=100;
    if(m>=11){
        for(i=1;i<=maxk;i++){
                /*
            for(t=0;t<s.size();t++){
                s[t]=mp[s[t]];
            }
            */
            for (char& ch : s) {
                if (mp[ch]) ch = mp[ch];
            }
            //cout << s << "\n";
            if(maa[s]==0){
                maa[s]=1;
                vt.push_back(s);
            }
            else{
                for(j=0;j<vt.size();j++){
                    if(vt[j]==s){
                        t1=j;
                        break;
                    }
                }
                /*
                cout << maa.size() << "\n";
                cout << vt.size() << "\n";
                t=maa.size();
                cout << t <<  " " << t1 << "\n";
                for(j=0;j<vt.size();j++){
                    cout << vt[j] << "\n";
                }
                */
                t=maa.size();
                break;
            }
        }
        for(i=1;i<=m;i++){
            if(k[i]<=t1){
                cout << vt[k[i]-1] << "\n";
            }
            else if(t1!=0){
                cout << vt[(k[i]-1)%(t-t1)+t1] << "\n";
            }
            else{
                cout << vt[k[i]%(t-t1)+t1] << "\n";
            }
        }
    }
    else{

        for(i=1;i<=maxk;i++){
            /*
            for(t=0;t<s.size();t++){
                s[t]=mp[s[t]];
            }
            */
            for (char& ch : s) {
                if (mp[ch]) ch = mp[ch];
            }
            /*
            if(mpp.find(i)!=mpp.end()){
                //cout << s << "\n";
                mpp[i]=s;
            }
            */
            mpp[i]=s;
        }
        for(i=1;i<=m;i++){
            cout << mpp[k[i]] << "\n";
        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922832.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java三大特性:封装、继承、多态【详解】

封装 定义 隐藏对象的属性和实现细节&#xff0c;仅对外公开接口&#xff0c;控制在程序中属性的读取和修改的访问级别便是封装。 在开发中造一个类就是封装&#xff0c;有时也会说封装一个类。封装可以隐藏一些细节或者包含数据不能被随意修改。 比如这是一个敏感的数据&a…

40分钟学 Go 语言高并发:【实战】并发安全的配置管理器(功能扩展)

【实战】并发安全的配置管理器&#xff08;功能扩展&#xff09; 一、扩展思考 分布式配置中心 实现配置的集中管理支持多节点配置同步实现配置的版本一致性 配置加密 敏感配置的加密存储配置的安全传输访问权限控制 配置格式支持 支持YAML、TOML等多种格式配置格式自动…

【ChatGPT大模型开发调用】如何获得 OpenAl API Key?

如何获取 OpenAI API Key 获取 OpenAI API Key 主要有以下三种途径&#xff1a; OpenAI 官方平台 (推荐): 开发者用户可以直接在 OpenAI 官方网站 (platform.openai.com) 注册并申请 API Key。 通常&#xff0c;您可以在账户设置或开发者平台的相关页面找到申请入口。 Azure…

苹果系统中利用活动监视器来终止进程

前言 苹果系统使用的时候总是感觉不太顺手。特别是转圈的彩虹球出现的时候&#xff0c;就非常令人恼火。如何找到一个像Windows那样任务管理器来终止掉进程呢&#xff1f; 解决办法 Commandspace 弹出搜索框吗&#xff0c;如下图&#xff1a; 输入“活动”进行搜索&#xff…

实战项目负载均衡式在线 OJ

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能自己实现负载均衡式在线 OJ。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1…

python Flask指定IP和端口

from flask import Flask, request import uuidimport json import osapp Flask(__name__)app.route(/) def hello_world():return Hello, World!if __name__ __main__:app.run(host0.0.0.0, port5000)

burp suite-1

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

【Spring boot】微服务项目的搭建整合swagger的fastdfs和demo的编写

文章目录 1. 微服务项目搭建2. 整合 Swagger 信息3. 部署 fastdfsFastDFS安装环境安装开始图片测试FastDFS和nginx整合在Storage上安装nginxnginx安装不成功排查:4. springboot 整合 fastdfs 的demodemo编写1. 微服务项目搭建 版本总结: spring boot: 2.6.13springfox-boot…

【区块链】深入理解椭圆曲线密码学(ECC)

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解椭圆曲线密码学(ECC)1. 概述2. 椭圆曲线的数学基础2.1 基本定义2.2 有限…

【Qt流式布局改造支持任意位置插入和删除】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、源代码二、删除代码三、扩展总结 前言 最近在做一个需求需要流式布局&#xff0c;虽然官方example里有一个流式布局范例&#xff0c;但是不能满足我的需求…

JQuery -- 第九课

文章目录 前言一、JQuery是什么&#xff1f;二、JQuery的使用步骤1.引入2.书写位置3. 表示方法 三、JQuery选择器1.层级选择器2. 筛选选择器3. 排他思想4. 精品展示 四、jQuery样式操作1. 修改样式2.类操作1. 添加2. 移除3. 切换 五、jQuery动画1. 显示和隐藏2. 滑动1. slide2.…

Python 版本的 2024详细代码

2048游戏的Python实现 概述&#xff1a; 2048是一款流行的单人益智游戏&#xff0c;玩家通过滑动数字瓷砖来合并相同的数字&#xff0c;目标是合成2048这个数字。本文将介绍如何使用Python和Pygame库实现2048游戏的基本功能&#xff0c;包括游戏逻辑、界面绘制和用户交互。 主…

在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的?

大家好&#xff0c;我是锋哥。今天分享关于【在Elasticsearch中&#xff0c;是怎么根据一个词找到对应的倒排索引的&#xff1f;】面试题。希望对大家有帮助&#xff1b; 在Elasticsearch中&#xff0c;是怎么根据一个词找到对应的倒排索引的&#xff1f; 在 Elasticsearch 中…

C# 数据结构之【图】C#图

1. 图的概念 图是一种重要的数据结构&#xff0c;用于表示节点&#xff08;顶点&#xff09;之间的关系。图由一组顶点和连接这些顶点的边组成。图可以是有向的&#xff08;边有方向&#xff09;或无向的&#xff08;边没有方向&#xff09;&#xff0c;可以是加权的&#xff…

Mac 系统上控制台常用性能查看命令

一、top命令显示 在macOS的控制台中&#xff0c;top命令提供了系统当前运行的进程的详细信息以及整体系统资源的利用情况。下面是对输出中各个字段的解释&#xff1a; Processes: 483 total: 系统上总共有483个进程。 2 running: 当前有2个进程正在运行。 481 sleeping: 当前有…

Docker--通过Docker容器创建一个Web服务器

Web服务器 Web服务器&#xff0c;一般指网站服务器&#xff0c;是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档&#xff0c;也可以放置网站文件以供全世界浏览&#xff0c;或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…

Linux网络——NAT/代理服务器

一.NAT技术 1.NAT IP转换 之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题&#xff0c;NAT 技术就是当前解决 IP 地址不够用的主要手段, 是路由器的一个重要功能。 NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是一种将私有 IP 和全局IP 相互转化的技术方法: 很…

极简开源Windows桌面定时提醒休息python程序

当我们长期在电脑面前坐太久后&#xff0c;会产生一系列健康风险&#xff0c;包括干眼症&#xff0c;颈椎&#xff0c;腰椎&#xff0c;肌肉僵硬等等。解决方案是在一定的时间间隔内我们需要have a break, 远眺可以缓解干眼症等眼部症状&#xff0c;站起来走动两步&#xff0c;…

Windows Qtcreator不能debug 调试 qt5 程序

Windows下 Qt Creator 14.0.2 与Qt5.15.2 正常release打包都是没有问题的&#xff0c;就是不能debug&#xff0c;最后发现是两者不兼容导致的&#xff1b; 我使用的是 编译器是 MinGW8.1.0 &#xff0c;这个版本是有问题的&#xff0c;需要更新到最新&#xff0c;我更新的是Mi…

【论文笔记】Number it: Temporal Grounding Videos like Flipping Manga

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Number it: Temporal Grou…