CF 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 ; }