题目
题意:输入t组数据。每组输入n,m;接下来输入长度为n的字符串,再输入m个数pi,(1-pi之间的字符串都会敲一遍),最后还会敲一遍1-n的字符。输出最终每个字符被敲的次数。
思路:暴力写会超时,进行复杂度分析是很重要的一步。前缀和与差分解决这类问题十分常用。
AC代码
#include <bits/stdc++.h>
using namespace std;
int dp[200010][30],cnt[30];
char s[200010];
int main()
{
int t,n,m;
cin>>t;
while(t--)
{
cin>>n>>m;
scanf("%s",s+1);
for(int i=1; i<=n; i++)
{
for(int j=0; j<26; j++)
dp[i][j]=0;
}
for(int i=1; i<=n; i++)
{
dp[i][s[i]-'a']++;
for(int j=0; j<26; j++)
{
dp[i][j]+=dp[i-1][j];//前缀和数组
}
}
for(int i=0; i<26; i++)
{
cnt[i]=dp[n][i];//二维压缩成最后的一维
}
while(m--)
{
int pos;
cin>>pos;
for(int i=0; i<26; i++)
{
cnt[i]+=dp[pos][i];
}
}
for(int i=0; i<25; i++)
{
cout<<cnt[i]<<" ";
}
cout<<cnt[25]<<endl;
}
return 0;
}