Codeforces 294D

STL map的運用


// Codeforces 294D
#include<iostream>
#include<cstdio>
#include<memory.h>
#include<cstring>
#include<map>
using namespace std;

int main(){
	int val[26], i;
	long long res = 0, prefixSum[100100];
	char str[100100];

	for (i = 0; i <= 25; i++) cin >> val[i];
	cin.ignore(100, '\n');
	cin >> str;
	int len = strlen(str);

	map<long long, int> alphaMap[26];

	prefixSum[0] = val[str[0] - 'a'];
	for (i = 1; i <= len - 1; i++)
		prefixSum[i] = prefixSum[i - 1] + val[str[i] - 'a'];

	map<long long, int>::iterator iter;
	alphaMap[str[0] - 'a'][prefixSum[0]] = 1;
	for (i = 1; i <= len - 1; i++){
		// 查找在i之前,相同字符且前綴和等於prefixSum[i - 1]的位置有多少個
		iter = alphaMap[str[i] - 'a'].find(prefixSum[i - 1]);
		if (iter != alphaMap[str[i] - 'a'].end())
			res += alphaMap[str[i] - 'a'][prefixSum[i - 1]];

		// 將prefixSum[i]插入該字母的map中
		iter = alphaMap[str[i] - 'a'].find(prefixSum[i]);
		if (iter == alphaMap[str[i] - 'a'].end())
			alphaMap[str[i] - 'a'][prefixSum[i]] = 1;
		else alphaMap[str[i] - 'a'][prefixSum[i]]++;
	}

	cout << res << endl;

	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章