Logo zibenlun 的博客

博客

P10058

...
zibenlun
2025-12-01 12:58:17
分块好啊

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2024-01-14 21:53:31

代码比较好写,但是思考起来比较难

首先看出在两次翻转之间的左移和右移是可以互相抵消一部分的,之后就是比较难想到的一部分。

把翻转变成改变头和尾

规律

可以看到先翻转还是先移动结果一样,只是移动方向需要改变。具体为每遇到一个翻转就把原先累积的移动方向和头尾改变一下,最后再统一移动。

CODE

#include<bits\/stdc++.h>
#define int long long
using namespace std;
inline long long read() {
	long long s=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') {
		s=(s<<3)+(s<<1)+(ch^48);
		ch=getchar();
	}
	return s;
}
inline void write(long long x) {
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x\/10);
	putchar(x%10+'0');
}
char s[1000005];
int n,flag,pos,len;
deque<char>q;
void make(){
	int u=abs(pos);
	if(u>len\/2){
		u=len-u;
		if(pos>0) pos=-u;
		else pos=u;
	}
	if(flag==0){
		if(pos>0){
			pos%=len;
			while(pos){
				q.push_back(q.front());
				q.pop_front();
				pos--;			
			}
		}
		else {
			pos=-pos;
			pos%=len;
			while(pos){
				q.push_front(q.back());
				q.pop_back();	
				pos--;			
			}
		}
	}
	else {
		if(pos>0){
			pos%=len;
			while(pos){
				q.push_front(q.back());
				q.pop_back();	
				pos--;			
			}
		}
		else {
			pos=-pos;
			pos%=len;
			while(pos){
				q.push_back(q.front());
				q.pop_front();	
				pos--;			
			}
		}
	}
}
void print(){
	if(flag==0){
		while(q.size()){
			putchar(q.back());
			q.pop_back();
		}
	}
	else {
		while(q.size()){
			putchar(q.front());
			q.pop_front();
		}
	}
}
signed main() {
	scanf("%s",s);
	len=strlen(s);
	for(int i=0;i<len;i++){
		q.push_front(s[i]);
	}
	n=read();
	for(int i=1;i<=n;i++){
		char ss[10];
		int x;
		scanf("%s",ss);
		if(ss[0]=='>'){
			x=read();
			pos+=x;
		}
		else if(ss[0]=='<'){
			x=read();
			pos-=x;
		}
		else {
			pos=-pos;
			flag=!flag;
		}
	}
	make();
	print();
	return 0;
}

个人码风不好,见谅。

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。