时间:1s 空间:256M
题目描述:
小友给了小信一个长度为n的只包含"L"和 的"R"字符串移动序列S。
对应的,小信有一个1×n的棋盘,一开始每个格子上都放着一颗棋子。
每一轮移动,每个格子上的棋子按照它当前位置对应移动序列的字母来决定向左还是向右移动,“L”则向左移动一格,“R”则向右移动一格。
请输出经过 10100 轮移动后每个格子上棋子的个数。
输入格式:
第一行包含一个字符串S。
输出格式:
输出一行n个整数,表示经过 10100 轮移动后每个格子上棋子的个数。
字符串虽然长,但是L和R是可以抵消的。
#include<bits/stdc++.h>
using namespace std;
char s[100001];
int a[100001];
int main(){
int x=0,y=0;
cin>>s;
int n=strlen(s);
for(int i=0;i<n;i++){
a[i]=1;
}
for(int i=0;i<n;i++){
if(s[i+1]=='L'&&s[i]=='R'){
bool c=0,k=0;
for(int j=i+2;j<n;j++){
if(s[j]=='R'){
break;
}
c=1;
y++;
k++;
}
a[i]+=x/2+(y-y/2);
a[i+1]+=y/2+(x-x/2);
i+=k;
if(c==1)i-=1;
x=0;
y=0;
continue;
}
if((s[i]=='R'&&s[i+1]=='R')||(s[i]=='L'&&s[i-1]!='R')){
a[i]=0;
}
if(s[i]=='R'){
x++;
}
}
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
}