Решение задачи Выполни комбо с Codeforces

Без пояснения   Просмотров: 42


Вы хотите выполнить комбо против своего соперника в одном популярном файтинге. Комбо — это строка s, состоящая из n строчных букв латинского алфавита. Чтобы выполнить комбо, вам нужно нажать все кнопки в том порядке, в котором они появляются в s. То есть, если s=«abca», то вам нужно нажать 'a', затем 'b', 'c' и снова 'a'.

Вы знаете, что вы потратите m неверных попыток, чтобы выполнить комбо, и во время i-й попытки вы ошибетесь ровно после pi-й кнопки (1≤pi
То есть, если s=«abca», m=2 и p=[1,3], то последовательность нажатых кнопок будет равна 'a' (здесь вы допускаете ошибку и начинаете выполнять комбо сначала), 'a', 'b', 'c', (здесь вы допускаете ошибку и начинаете выполнять комбо сначала), 'a' (заметьте, что в этот момент вы не выполните комбо из-за ошибки), 'b', 'c', 'a'.

Ваша задача — для каждой кнопки (буквы) посчитать, сколько раз вы ее нажмете.

Вам требуется ответить на t независимых наборов входных данных.

Код

#include <bits/stdc++.h>

using namespace std;

int main() {
        int t;
	cin >> t;
	while (t--) {
		int n, m, temp;
		string s;
		cin >> n >> m >> s;
        vector<int> t(n);
        for(int i = 0; i < m; ++i){
            cin >> temp;
            t[temp - 1]++;
        }
        for(int i = n - 1; i > 0; --i){
            t[i - 1] += t[i];
        }
        vector<int> ans(26);
        for(int i = 0; i < t.size(); ++i){
            ans[s[i] - 'a'] += t[i];
            ++ans[s[i] - 'a'];
        }
		for (int i = 0; i < 26; ++i) {
			cout << ans[i] << " ";
		}
		cout << endl;
	}

	return 0;
}

         

Администратор Photo Автор: Администратор



Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться