Easy Tape Programming CodeForces 239B

题目描述:

There is a programming language in which every program is a non-empty sequence of "<" and ">" signs and digits. Let's explain how the interpreter of this programming language works. A program is interpreted using movement of instruction pointer (IP) which consists of two parts.

  • Current character pointer (CP);
  • Direction pointer (DP) which can point left or right;

Initially CP points to the leftmost character of the sequence and DP points to the right.

We repeat the following steps until the first moment that CP points to somewhere outside the sequence.

  • If CP is pointing to a digit the interpreter prints that digit then CP moves one step according to the direction of DP. After that the value of the printed digit in the sequence decreases by one. If the printed digit was 0 then it cannot be decreased therefore it's erased from the sequence and the length of the sequence decreases by one.
  • If CP is pointing to "<" or ">" then the direction of DP changes to "left" or "right" correspondingly. Then CP moves one step according to DP. If the new character that CP is pointing to is "<" or ">" then the previous character will be erased from the sequence.

If at any moment the CP goes outside of the sequence the execution is terminated.

It's obvious the every program in this language terminates after some steps.

We have a sequence s1, s2, ..., sn of "<", ">" and digits. You should answer q queries. Each query gives you l and r and asks how many of each digit will be printed if we run the sequence sl, sl + 1, ..., sr as an independent program in this language.

Input

The first line of input contains two integers n and q (1 ≤ n, q ≤ 100) — represents the length of the sequence s and the number of queries.

The second line contains s, a sequence of "<", ">" and digits (0..9) written from left to right. Note, that the characters of s are not separated with spaces.

The next q lines each contains two integers li and ri (1 ≤ li ≤ ri ≤ n) — the i-th query.

Output

For each query print 10 space separated integers: x0, x1, ..., x9 where xi equals the number of times the interpreter prints i while running the corresponding program. Print answers to the queries in the order they are given in input.

Examples

input

7 4
1>3>22<
1 3
4 7
7 7
1 7

output

0 1 0 1 0 0 0 0 0 0 
2 2 2 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
2 3 2 1 0 0 0 0 0 0 

题目大意:给你两个指针,一个记录当前位置(cp),一个记录移动方向(dp)。然后重复执行两个命令。输出cp在整个程序中打印每个数的的个数。

思路:跟着题目模拟一遍。在处理第二个命令时,用一个变量记录上一个方向字符的位置。处理第一个命令时,将这个变量归零。

#include<bits/stdc++.h>
using namespace std;
char a[105],b[105];
int main()
{
    int n,q,l,r;
    for(scanf("%d%d%s",&n,&q,a); q--;)
    {
        memcpy(b,a,sizeof(a));
        scanf("%d%d",&l,&r);
        l--,r--;//让l.r和下标想对应
        int s[10]= {0},i=l,p=n,d=1;
        for(; i>=l&&i<=r; i+=d)
        {
            if(b[i]>='0'&&b[i]<='9')
                s[(b[i]--)-'0']++,p=n;//命令1,变量p归零
            else if(b[i]=='<'||b[i]=='>')//命令2
            {
                if(b[p]=='<'||b[p]=='>')
                    b[p]=0;
                p=i;//记录上一个方向字符的位置
                d=b[i]=='<'?-1:1;//记录方向
            }
        }
        for(i=0; i<10; i++)
            printf("%d ",s[i]);
        puts("");
    }
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值