P10058被卡常,求调(代码有注释)
  • 板块灌水区
  • 楼主Flying_hp
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/9/23 17:21
  • 上次更新2024/9/23 20:15:33
查看原帖
P10058被卡常,求调(代码有注释)
1123665
Flying_hp楼主2024/9/23 17:21

如题;

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s,command;
ll n;
ll res;
bool flag=true;
signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>s;
	cin>>n;
	string sp=s+s+s,sr=s; 
	s=sp; 
	ll l=sr.size(),r=l+sr.size()-1;//记录原字符串,并将原字符串拼接三次,以后向左/右循环时直接移动l,r即可
	while(n--) {
		cin>>command;
		if(command=="rev") {//如果是翻转操作的话,求更改标记。 
			flag=!flag;
			continue;
		}
		cin>>res;
		if(flag==false) {
			if(command==">")command="<";//根据标记更改方向 
			else command=">";
		}
		ll mv=(command==">"?-1:1);//方向 
		res%=sr.size();//如果循环字符串的数量次数,就可以省略 
		if(mv==-1) {
			if(l+res*mv<0)s=sr+s,l+=sr.size(),r+=sr.size();//如果超过现有长度,就在前/后增加原字符串 
		}
		if(mv==1) {
			if(r+res*mv>s.size())s=s+sr;
		}
		l+=mv*res,r+=mv*res;//l,r风别移动 
	}
	if(flag) {//反向输出/正向输出 
		for(ll i=l; i<=r; i++) {
			cout<<s[i];
		}
	} else {
		for(ll i=r; i>=l; i--) {
			cout<<s[i];
		}
	}
	return 0;
}
2024/9/23 17:21
加载中...