NOIp模拟 同心锁

〖题目描述〗
纤云弄巧,飞星传恨,银汉迢迢暗度。金风玉露一相逢,便胜却人间无数。
柔情似水,佳期如梦,忍顾鹊桥归路。两情若是久长时,又岂在朝朝暮暮!
——秦观《鹊桥仙》
夜未央。带着细腻连绵的眼光遥望牛郎织女千年的爱情,平淡、精致且长久
的幸福感顿时氤氲在心。或许幸福就是这样,不求朝暮合,但求永同心。据说同
心锁是恋人们定情的一种信物,上面刻着两人的名字,它见证着天长地久的爱情,
诉说着爱情的坎坷与甜蜜。
据说在一座OI 桥上,同心锁上显示的文字有着它奇异的呈现方式,需要你
把它稍做改变才可解密。每个同心锁上都有3 个数据。第一个数据是一个字符串
s。第二个数据m 表示把s 串从m 处分为两段,s[1]至s[m-1]为a 串,s[m]至最
后为b 串。第三个数据n 表示你需要做改变的方式。第4 个数据表示把n 处理后
的s 串每个字母变重复次数p,不用重复则为0。
当n=1 时,把s 串中所有大写字母改成小写字母,把所有小写字母改成大写
字母,然后在后面加上‘Immorta1’;
当n=2 时,从s 串中删除所有出现的和b 一样的子串,然后把所有出现的
‘1013’改成‘hh4742’。
当n=3 时,在a 串部分的|n-m|-1 和|n-m|之间插入b 串,并删除b 串部分。
〖输入格式〗
第一行有一个字符串s(长度不超过1993);
第二行有3 个数:m(1<m<s 的长度)、n(1、2 或3)、p(0<=p<100)。
〖输出格式〗
输出一个字符串,为经过多次变化后最终得到的s。
〖样例输入1〗
MEIYOUwsshujuBYhh4742
14 1 1
〖样例输出1〗
mmeeiiyyoouuWWSSSSHHUUJJUUbbyyHHHH44774422IImmmmoorrttaa11
〖样例输入2〗
oiBYhh4742MEIYOU1013hh4742wsshujuBYhh4742
34 2 0
〖样例输出2〗
oiMEIYOUhh4742hh4742wsshuju
〖样例输入3〗
ipkepk
5 3 3
〖样例输出3〗

Iiiippppkkkkppppkkkkeeee


这题目太有逼格了!!

/*复习了c++字符串的操作。*/
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 2016
using namespace std;
int m,n,p;
string st;
string res;
void change(string s){
    int l=s.size();
    for (int i=0;i<l;i++)
    {
        if (s[i]>='a'&&s[i]<='z') s[i]-=32;
        else if (s[i]>='A'&&s[i]<='Z') s[i]+=32;
    }
    res=s+"Immorta1";
}
void del(string s,string b){
    int p=0,lens=s.size(),lenb=b.size();
    string tmp;
    while(p<lens)
    {
        if (s.substr(p,lenb)==b) p+=lenb;
        else tmp+=s[p],p++;
    }
    p=0;
    while(p<tmp.size())
    {
        if (tmp.substr(p,4)=="1013") res+="hh4742",p+=4;
        else res+=tmp[p],p++;
    }
}
void push(string a,string b){
    int k=abs(n-m)-1;
    res=a.substr(0,k);
    res+=b;
    res+=a.substr(k,a.size()-k);
}
void work(){
    string a=st.substr(0,m-1);
    string b=st.substr(m-1,st.size()-m+1);
    switch(n)
    {
        case 1:change(st);
               break;
        case 2:del(st,b);
               break;
        case 3:push(a,b);
               break;
    }
    for (int i=0;i<res.size();i++)
        for (int j=1;j<=p+1;j++) printf("%c",res[i]);
    printf("\n");
}
int main(){
    freopen("lock.in","r",stdin);
    freopen("lock.out","w",stdout);
    cin >> st;
    cin >> m >> n>>p;
    work();
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值