CF Easy Tape Programming(题意)

B. Easy Tape Programming

这是前几天CF比赛上的B题,应该不算一道难题,但是题意很难理解,至少我读了三遍都没理解,最后弄明白了也就知道怎么做了。现在来说说这道题的题意。

有一个程序语言是由'<'、'>'、0~9这些字符组成的,而这个程序的执行规则是,有两个指针,一个CP指针指向某个字符,还有一个DP来决定CP指针向哪个方向移动,初始的时候CP指针指向最左边的字符,DP指针向右的,然后开始移动CP,当CP前一个指向的是数字的时候,那个数字自减一,如果这个数字减到了0,那么就把这个数字从字符串中删除,如果前一个指向的是'<'或'>'的话,那么就把它删除,也就是如果有几个'<','>'连续,只留下一个,但CP指针出了给定的范围就结束执行,给出q个查询,让你输出的是执行完每次查询后,0~9这10个数字出现了多少次。

注意:是对CP指向的前一个字符进行操作,而且初始的方向是向右的,所以如果有一个306<<>4>04这样一个字符串,在CP指向第四个'<'是方向还是向右的。第一次错在了第六个样例上了。

参考代码:

View Code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define  N 105
using namespace std ;

int num[N] ;
char str[N] , st[N] ;

int main()
{
    int n , q , pos , flag , dir , l , r , i ;

    while ( scanf ( "%d%d%s" , &n , &q , str ) != EOF )
    {
        while ( q-- )
        {
            memset( num , 0 , sizeof ( num )) ;
            memcpy( st ,str , sizeof ( str )) ;
            scanf ( "%d%d" , &l , &r ) ;
            l-- ; r-- ;
            flag = 0 ; pos = 0 ; dir = 1 ;
            for( i = l ; i >= l && i <= r ; i += dir )
            {
                if ( st[i] >= '0' && st[i] <= '9' )
                {
                    num[st[i]-'0']++ ;
                    if ( st[i] == '0' ) st[i] = 0 ;
                    else
                    st[i]-- ;
                    flag = 0 ;// dir = 1 ;
                }
                else if ( st[i] == '>' )
                {
                    dir = 1 ;
                    if ( flag )
                    st[pos] = 0 ;
                    flag = 1 ; pos = i ;
                }
                else if ( st[i] == '<' )
                {
                    dir = -1 ;
                    if ( flag )
                    st[pos] = 0 ;
                    flag = 1 ; pos = i ;
                }
            }
            for ( i = 0 ; i <= 9 ; i++ )
            {
                if ( i )
                printf ( " %d" , num[i] ) ;
                else
                printf ( "%d" , num[i] ) ;
            }
            printf ( "\n" ) ;
        }
    }
    return 0 ;
}
原文地址:https://www.cnblogs.com/misty1/p/2759170.html