题目描述
n 名演员围成一个圆圈跳集体舞,每名演员都有一个位置。演员与位置的编号都是从 1 开始到 n 结束。最初,第 i 号演员站在第 i 号位置。
在表演过程中,陆续会出现若干变换,变换分成两种类型:
-
第一种变换称为旋转,用字母
r
表示。在这种变换下:- 原先 1 号位上的演员将移动去 2 号位
- 原先 2 号位上的演员将移动去 3 号位
- … 以此类推
- 原先 n 号位上的演员将移动去 1 号位
-
第二种变换称为翻转,用字母
f
表示。在这种变换下:- 1 号位上的演员与 n 号位上的演员对换
- 2 号位上的演员与 n−1 号位上的演员对换
- … 以此类推
- 特别注意,若 n 是奇数,则在翻转变换下(n+1)/2 号位置上的演员位置不变。
依次给定集体舞经历的变换类型,在舞蹈结束后,依次输出每个位置上的演员编号。
#include<bits/stdc++.h>
using namespace std;
int n,jl=0;//The distance to the right=0
string s;
bool fx=1;
int a[500005];
int main(){
cin>>n>>s;
int len=s.size();
for(int i=0;i<len;i++){
if(s[i]=='f') fx=!fx;//Change direction
if(s[i]=='r'){//Change the distance
if(fx) jl++;
else jl--;
}
}jl%=n;
if(jl>0){
for(int i=1;i<=n;i++){
a[i]=i-jl;
if(a[i]<=0) a[i]+=n;
}
}else{
for(int i=1;i<=n;i++){
a[i]=i-jl;
if(a[i]>n)a[i]-=n;
}
}if(fx) for(int i=1;i<=n;i++)printf("%d\n",a[i]);
else for(int i=n;i>=1;i--)printf("%d\n",a[i]);
}