B. Простое Ленточное Программирование

а вот теперь мне серьезно не помешает посторонняя помощь

есть задача, условие тут:
http://codeforces.ru/problemset/problem/...

в принципе, дабы по ссылкам не ходить:

/*
ввод
standard input
вывод
standard output

Существует язык программирования, 
в котором каждая программа представлена непустой последовательностью 
символов «<» и «>» и цифр. Объясним, как работает интерпретатор этого языка
 программирования.Программа интерпретируется посредством 
движения указателя команды (IP), который состоит из двух частей.
    Указатель текущего символа (CP);
    Указатель направления (DP), который может указывать налево или направо; 
Изначально CP указывает на крайний левый символ в последовательности, 
а DP указывает направо. Мы повторяем следующие шаги до тех пор,
 пока CP впервые укажет куда-то за пределы последовательности.
    Если CP указывает на цифру, то интерпретатор выводит эту цифру. 
Затем CP перемещается на один шаг согласно направлению DP. 
После этого значение написанной в последовательности цифры уменьшается на один. 
Если выведенная цифра была 0, значит, ее нельзя уменьшить. 
Поэтому она удаляется из последовательности, и длина последовательности уменьшается на один.
    Если CP указывает на «<» или «>», то направление DP меняется на «влево» или «вправо», 
соответственно. Затем CP двигается на один шаг согласно DP. 
Если новый символ, на который указывает CP — это «<» или «>», 
то предыдущий символ будет удален из последовательности. 

Если в какой-то момент выполнения программы CP выходит за пределы последовательности,
 то выполнение программы завершается.

У Вас есть последовательность s1,?s2,?...,?sn, состоящая из символов «<», «>» и чисел. 
Вы должны ответить на q запросов. Каждый запрос характеризуется двумя целыми числами l и r 
и спрашивает, сколько раз будет выведена каждая цифра, если мы запустим
 последовательность sl,?sl?+?1,?...,?sr как независимую программу на описанном языке.

В первой строке входных данных содержатся два целых числа n и q (1???n,?q???100) — 
длина последовательности s и количество запросов. 

Вторая строка содержит s, последовательность из «<», «>» и цифр (0..9), 
записанных слева направо. Заметьте, что символы s не разделяются пробелами. 

Каждая из следующих q строк содержит по два целых числа li и ri (1???li???ri???n) — i-ый запрос.
Для каждого запроса выведите 10 целых чисел, записанных через пробел: x0,?x1,?...,?x9, 
где xi равняется количеству выведенных цифр i при выполнении соответствующей программы из запроса. 
Выводите ответы на запросы в том порядке, в каком запросы даны во входных данных.

*/
vedro-compota's picture

это задача из текущего семестра? (условие ещё не читал - вечером посмотрю)

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

так какие у вас есть соображения по поводу решения? предлагаю удалить ужасно процитированное условие и написать что вы думаете по поводу способа решения задачи.

_____________
матфак вгу и остальная классика =)

baton's picture

насколько я понял условие задачи,
изначально последовательность представляет строку символов (чаров) (точнее даже не строку, а список - про списки читаем в книге "C++. Освой на примерах, Динман М.И." ( http://padabum.com/d.php?id=9670), пятая глава книги), заполненной всевозможной кашей - это следует из "....Если CP указывает на цифру..."
пытаюсь научиться адекватно конвертировать чар в инт.
таким способом вроде должно получиться - http://www.gamedev.ru/code/forum/?id=398...
потом.... есть структура IP, чей элемент CP есть указатель на (n)ный член последовательности, а DP есть char, принимающий два значения ( "") указывающие (n+1)ный или (n-1)ный член последовательности будет обработан после (n)ного
два вложеных цикла (один в другой) с несколькими условиями обрабатывают каждый член, если он - цифра, при этом - строго больше нуля - то, выводится на экран и уменьшается на один; если встречается "", то значение DP меняется. если член последовательности не цифра или ноль (меньше нуля), он удаляется из последовательности.

кроме того, количество повторений цикла ("запросов") задается пользователем.

но все равно в голове немного каша..
кстати есть костяк программы, но я никак не могу до конца его осознать (т.к. нахожусь в процессе познания теории) и пытаюсь писать свой костяк....

данный мне:

#include <string>

using namespace std;

#ifdef _DEBUG || BEBUG
	#include <fstream>
	ifstream cin("input.txt");
	ofstream cout("output.txt");
#else
	#include <iostream>
#endif


void process(string s) {
	int pos = 0;
	char dir = '>';
	int outputs[10] = { 0 };

	// интерпретация программы

	for (int i = 0; i < 10; i++) {
		if (i > 0)
			cout << " ";
		cout << outputs[i];
	}
	cout << endl;
}

int main(int argc, char* argv[])
{
	int n, q;
	string s;

	cin >> n >> q >> s;

	for (int i = 0; i < q; i++) {
		int l, r;
		cin >> l >> r;
		process(s.substr(l - 1, r - l + 1));
	}
}

baton's picture

особо меня смущают примеры тестов программы, приведенные в условии для самопроверки:

Примеры тестов
Входные данные

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

Выходные данные

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

очевидно, вся фишка заключена в этих строках:
"..У Вас есть последовательность s1,?s2,?...,?sn, состоящая из символов «» и чисел. Вы должны ответить на q запросов. Каждый запрос характеризуется двумя целыми числами l и r и спрашивает, сколько раз будет выведена каждая цифра, если мы запустим последовательность sl,?sl?+?1,?...,?sr как независимую программу на описанном языке..."
но я все еще не догоняю, что и как надо написать.

baton's picture

задача построена на идее преобразования типа char в int и наоборот.
инт в чар переводится без особых проблем (по определению чар это числовое значение, номер символа)
а для преобразования чар в инт нужны специальные средства. как правило можно обойтись функцией atoi();
пример кода:

void main(){
	char * a = new char;
	int n;
	cin >> a;
	n = atoi(a);
	cout << endl << n; 

getch();
}

как мы можем видеть, тут значению эн типа инт присваивается значение а типа чар. все весьма просто.
едем дальше.

baton's picture

мы должны будем так же сравнивать отвечает ли символ определенному условию, или нет - делается это следующим образом

void main(){
	setlocale(LC_ALL, "Russian");
	char c;
	cin >> c;
	if(c == '>')  // кавычки одинарные!
		cout << endl << "ля-ля, тополя";
	else
		cout << endl << "не-а";

getch();
}