2023 RoboCom 世界机器人开发者大赛-本科组(国赛)

RC-u1 睿抗,启动!

你被委托开发一个用于睿抗机器人开发者大赛CAIP-编程技能赛的管理系统,这个管理系统需要一些账号名和密码,你需要按照规则根据账号生成对应的密码,具体规则是:

  1. 将当前操作的字符串初始化为提供的账号名。
  2. 每次生成会规定一个生成轮次 N。
  3. 对于每一轮次,按顺序执行以下操作:
  • 对于当前操作的字符串,将所有大写字母替换为后一个字母;如将 A 替换为 B,B 替换为 C,以此类推。特别地,将 Z 替换为 A。对于所有小写字母,将其替换为前一个字母,如将 z 替换为 y,以此类推。特别地,将 a 替换为 z。
  • 对于完成上一步后的字符串,如果连续出现了至少三个大写字母(不一定要相同),则将这些连续的大写字母全部改为小写字母;对于连续出现了至少三个小写字母(不一定要相同),则将这些连续的小写字母全部改为大写字母。注意修改不在原地进行,即修改结果不影响本次步骤中对于连续的判定。

现在给定账号名以及轮次,请你生成对应的密码。

输入格式:

输入第一行是一个正整数 N (1≤N≤10),表示生成的轮次数;

输入第二行是一个字符串 S (1≤∣S∣≤100),表示需要操作的账号名。账号名只包含大小写及数字。

注意:如果 S 为 yourname,请将 S 改为你的名字的拼音拼写,全小写,不包含空格。如你的名字为张三,则你操作的字符串应为 zhangsan。请务必写真实姓名,写错误的名字可能会导致成绩被取消。

输出格式:

输出两行,第一行为账号名,第二行为根据规则生成的密码。

输入样例:

1
DOGcat1234XZxzABabFFXIV

输出样例:

DOGcat1234XZxzABabFFXIV
ephBZS1234YAwyBCzaggyjw

输入样例:

2
DOGcat1234XZxzABabFFXIV

输出样例:

DOGcat1234XZxzABabFFXIV
DOGcat1234ZBvxCDYZFFXIV

提示:

本题返回结果若为格式错误均可视为答案错误

分析:

暴力模拟即可,需要注意的是必须一步一步来,每次都要更新新的一轮的大写和小写的字母,当然也可以用更为巧妙的方法,硬做肯定错不了就是啦。

AC代码:

#include<bits/stdc++.h>

using namespace std;

// 连续出现了三个小写字母 全部改为大写字母
// 核心在于找到 连续的小写字母
const int N = 110;
int b[N] , b1[N] , sum[N] ,sum1[N], daxie[N] , xiaoxie[N];
string s;
char c[N];

void solve(){
	int n ;
	cin >> n ;
	cin >> s;
	if(s == "yourname") {
		s = "zhangsan" ;
		cout << s <<endl;
	}else cout << s <<endl;
	int n1 = s.size();
	for(int i = 0; i < n1 ; i ++) c[i + 1] = s[i];
	for(int o = 0 ; o < n ; o ++){
		memset(b , 0  ,sizeof b);
		memset(b1 , 0  ,sizeof b1);
		memset(sum , 0 ,sizeof sum);
		memset(sum1 , 0 , sizeof sum1);
		memset(daxie , 0 ,sizeof daxie);
		memset(xiaoxie , 0 ,sizeof xiaoxie);
		for(int i = 1 ; i<= n1 ; i++){
			if(islower(c[i])) b[i] = 1;
			else if(isupper(c[i])) b1[i] = 1;
		}
		for(int i = 1 ; i <= n1; i ++){
			if(b[i]) sum[i] = sum[i- 1] + b[i];
			else sum[i + 1] = 0 ; 
		}
		for(int i = 1 ; i <= n1; i ++){
			if(b1[i]) sum1[i] = sum1[i- 1] + b1[i];
			else sum1[i + 1] = 0 ; 
		}
		for(int i = s.size() ; i >= 1 ; i --){
			if(sum[i] >= 3){
				for(int j = i ; j >= i - sum[i] + 1 ; j--){
					daxie[j] = 1;
				}
				i = i - sum[i] + 1;
			}
		}
		for(int i = s.size() ; i >= 1 ; i --){
			if(sum1[i] >= 3){
				for(int j = i ; j >= i - sum1[i] + 1 ; j--){
					xiaoxie[j] = 1;
				}
				i = i - sum1[i] + 1;
			}
		}
	
		for(int i = 1 ; i <= n1; i++){
			if(islower(c[i])){
				int d = c[i] - 'a';
				int d1 = d - 1;
				char c1 = 'a' + ( d1 + 26 * 4 ) % 26;
				c[i] = c1;
			}else if(isupper(c[i])){
				int d = c[i] - 'A';
				int d1 = d + 1;
				char c1 = 'A' + d1 % 26;
				c[i] = c1;
			}
		}
		for(int i = 1; i <= n1 ; i++) if(daxie[i]) {
			c[i] = c[i] - 32;
		}
		for(int i = 1; i <= n1 ; i++) if(xiaoxie[i]) {
			c[i] += 32;
		}	
	}

	for(int i = 1 ; i<= n1 ; i++) cout <<c[i];
}

int main(){
	solve();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值