给出26个字母的值和一个字符串,求其子串中长度大于1且首尾字母相同且除首尾字母外字母的权值之和为0的个数。
扫一遍字符串,记录当前字母的前缀和,如果之前字母和当前字母相同且前缀和也相同,则说明该字母与之前字母间的字母权值之和为0。
扫一遍字符串,记录当前字母的前缀和,如果之前字母和当前字母相同且前缀和也相同,则说明该字母与之前字母间的字母权值之和为0。
#include<bits/stdc++.h>
using namespace std;
#define LL __int64
map<LL,LL>m[26];
char s[100005];
int main()
{
int i,a[26];
for(i=0;i<26;++i) scanf("%d",&a[i]);
scanf("%s",s);
LL ans=0,sum=0;
for(i=0;i<strlen(s);++i)
{
ans+=m[s[i]-'a'][sum];
sum+=a[s[i]-'a'];
++m[s[i]-'a'][sum];
}
printf("%I64d\n",ans);
return 0;
}