马蹄杯 砸键盘 题型:差分,哈希

149 阅读1分钟

码题集OJ-砸键盘 (matiji.net) image.png

样例输入1

abcdefghijklmnopqrstuvwxyz
3
1 26
1 10
19 23

样例输出1

2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 1 1 1

样例输入2

aymrnptzhklcbuxfdvjsgqweio
2
2 9
18 21

样例输出2

0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1

思想

一眼差分

但是需要注意的是输入的字符串并不一定是按abcd字典序升序排的,因此最后我们需要做一个哈希处理

#include<bits/stdc++.h>
using namespace std;
const int N = 30;
int a[N], sum[N], ans[N];

void insert(int l, int r)
{
	a[l]++, a[r + 1]--;
}
int main()
{
	string s; cin >> s;
	int n; cin >> n;

	for (int i = 0; i < n; i++)
	{
		int l, r; cin >> l >> r;
		insert(l, r);
	}


	for (int i = 1; i <= 26; i++) sum[i] = sum[i - 1] + a[i];

	for (int i = 1; i <= 26; i++) ans[s[i-1] - 'a'+1] = sum[i];  //哈希处理

	for (int i = 1; i <= 26; i++)cout << ans[i] << " ";   //输出就是按照字典序输出的
	return 0;
}

image.png