Description
有nn个正整数,给出aiai和ai+1ai+1的大小关系序列s1...sn−1s1...sn−1,sisi为=,L,R=,L,R分别表示aiai等于、大于、小于ai+1ai+1,求满足条件的序列中这nn个数的和最小对应的序列
Input
第一行一整数,之后一个长度为n−1n−1的字符串ss
Output
输出满足条件的和最小的序列
Sample Input
5
LRLR
Sample Output
2 1 2 1 2
Solution
aiai取其左边连续递增的长度和右边连续递减的长度中的较大值即可,用数组lr[i]lr[i]表示从si−1si−1开始往左连续的RR个数,用表示从sisi开始往右连续的LL的个数,从左往右扫一遍求出,从右往左扫一遍求出rlrl,以lr[i]lr[i]为例:
lr[i]=lr[i−1],si−1=′=′lr[i]=lr[i−1],si−1=′=′
lr[i]=0,si−1=′L′lr[i]=0,si−1=′L′
lr[i]=lr[i−1]+1,si−1=′R′lr[i]=lr[i−1]+1,si−1=′R′
以此转移即可,ai=max(lr[i],rl[i])+1ai=max(lr[i],rl[i])+1
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=1005;
int n,lr[maxn],rl[maxn];
char s[maxn];
int main()
{
scanf("%d",&n);
scanf("%s",s+1);
lr[0]=0;
for(int i=1;i<n;i++)
if(s[i]=='=')lr[i]=lr[i-1];
else if(s[i]=='L')lr[i]=0;
else lr[i]=lr[i-1]+1;
rl[n-1]=0;
for(int i=n-1;i>0;i--)
if(s[i]=='=')rl[i-1]=rl[i];
else if(s[i]=='R')rl[i-1]=0;
else rl[i-1]=rl[i]+1;
for(int i=0;i<n;i++)
printf("%d%c",max(lr[i],rl[i])+1,i==n-1?'\n':' ');
return 0;
}