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