题目链接:点击打开链接
题目大意是:一个字符串,字符集为小写字母,每个字母有一个值,求该字符串有多少个满足以下条件的子串:
1.子串头尾字母相同
2.除去首尾字母,其他字母值的和等于0。
3.串长>=2。
关键在于,如果一个子串满足条件,则该子串首位置的前缀和=尾位置前缀和-该字母的值。所以记录相同的结尾的前缀和的个数,开map即可。
#include <bits/stdc++.h>
using namespace std;
map<long long,int>save[26];
int val[26];
char str[100010];
int main()
{
long long tmp,cnt,ans;
ans = tmp = cnt = 0;
for(int i=0;i<26;i++){
scanf("%d",&val[i]);
}
scanf("%s",str);
int len;
len = strlen(str);
for(int i=0;i<len;i++){
ans+=save[str[i]-'a'][cnt];
cnt+=val[str[i]-'a'];
save[str[i]-'a'][cnt]++;
}
cout <<ans<< endl;
return 0;
}