据说在一座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
非常好的字符串处理题 比赛的时候用char数组做耗费了好久时间 还没做出来。
注意活用 s.substr(i,j) !!! //为string a 的第i个字符开始的j个字符
体会到了string的强大
#include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cstring> #include<iostream> using namespace std; //input #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s) #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) // #define N 2000+5 string s,ans; int main() { int m,n,cnt; cin>>s; cin>>m>>n>>cnt; string a=s.substr(0,m-1); string b=s.substr(m-1,s.size()-m+1); if(n==1) { REP(i,s.size()) { if(islower(s[i]))s[i]-=32; else if(isupper(s[i]))s[i]+=32; } ans=s+"Immorta1"; } else if(n==2) { int lens=s.size(); int lenb=b.size(); int i=0; string temp; while(i<lens) { if(s.substr(i,lenb)==b)i+=lenb; else temp+=s[i++]; } i=0; while(i<temp.size()) { if(temp.substr(i,4)=="1013")ans+="hh4742",i+=4; else ans+=temp[i++]; } } else { int k=abs(n-m)-1; string l=a.substr(0,k); string r=a.substr(k,a.size()-k); ans=l+b+r; } REP(i,ans.size()) for(int j=0;j<=cnt;j++) cout<<ans[i]; printf("\n"); }