思路:
求前綴和,循環中不要使用strlen函數會超時,是O(n^2)的複雜度
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
char s[200005];
long long c[30][200005];
long long ans[30];
int main()
{
int t;cin>>t;
while(t--)
{
for(int i=0;i<30;i++) ans[i]=0;
int n,m;
scanf("%d%d",&n,&m);
scanf("%s",s+1);
for(register int i=1;i<=n;++i)
///for(register int i=1;i<=strlen(s+1);++i) O(n^2)複雜度,超時
{
char C=s[i];
for(register int j=0;j<26;++j)
{
if(char('a'+j)==C)
c[j][i]=c[j][i-1]+1;
else
c[j][i]=c[j][i-1];
}
}
for(register int i=1;i<=m;++i)
{
int x;
scanf("%d",&x);
for(register int k=0;k<26;++k)
ans[k]+=c[k][x];
}
for(register int k=0;k<26;++k)
ans[k]+=c[k][n];
for(register int i=0;i<25;++i)
printf("%lld ",ans[i]);
printf("%lld\n",ans[25]);
}
}