CCF-CSP 字符串变换(c++&python)

 1.1题目描述

本题涉及字符包括大小写字母(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 中每个字符 cch 都替换为 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,例如不会同时有 f(b)=0 和 f(0)=0(b 和 0 都被替换为 0)。

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

1.2输入格式

从标准输入读入数据。

输入共 n+4 行。

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

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

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

1.3输出格式

输出到标准输出。

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

1.4样例输入

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

1.5样例输出

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

1.6子任务

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

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

全部测试数据保证 0<n≤63、0<m≤10^3、0<k≤10^9 且初始字符串 s 包含不超过 100 个字符。

1.7代码展示:

/*C++::code  score:80! */
#include<bits/stdc++.h>
using namespace std;

int main()
{
    string s;
    getline(cin,s);
    int n;
    cin>>n;
    cin.ignore();

    map<char,char>mp;
    for(int i=0;i<n;i++)
    {
        string ts;
        getline(cin,ts);
        mp.insert({ts[1],ts[2]});
    }
//    for(const auto& ele : mp)
//    {
//        cout<<ele.first<<":"<<ele.second<<endl;
//    }
    int m;
    cin>>m;
    vector<int> op_nums(m);
    for(int i=0;i<m;i++)
    {
        cin>>op_nums[i];
    }
    for(int op : op_nums)
    {
        string tmp=s;
        for(int i=0;i<op;i++)
        {
            for(char& c: tmp)
            {
                if(mp.find(c)!=mp.end())
                {
                    c=mp[c];
                }
            }
        }
        cout<<tmp<<endl;
    }
    return 0;
}
"""
Python
score:80!
"""
#依次遍历给出的字符串,如果有的话更换value
s=list(input())
n=int(input())
#存储更换前后的字符
mydict={}
for i in range(n):
    ts=list(input())
    a=ts[1]
    b=ts[2]
    mydict[a]=b
# for key,value in mydict.items():
#     print(key,value)
m=int(input())
#输出m个操作次数
mlist=[_ for _ in map(int,input().split())]
#遍历写入的操作次数
for num in mlist:
    #每次步入新的操作次数前拷贝初始化的字符串
    temp=s.copy()
    #按照每个操作次数循环
    for _ in range(num):
        #遍历字符串执行替换操作
        for k in range(len(temp)):
            if temp[k] in mydict:
                temp[k]=mydict[temp[k]]
    #将字符列表转换为字符串
    new_sentence="".join(temp)
    print(new_sentence)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值