Codeforces #624 div3 C

白昼怎懂夜的黑 提交于 2020-02-28 20:39:30

You want to perform the combo on your opponent in one popular fighting game. The combo is the string ss consisting of nn lowercase Latin letters. To perform the combo, you have to press all buttons in the order they appear in ss. I.e. if s=s="abca" then you have to press 'a', then 'b', 'c' and 'a' again.

You know that you will spend mm wrong tries to perform the combo and during the ii-th try you will make a mistake right after pipi-th button (1pi<n1≤pi<n) (i.e. you will press first pipi buttons right and start performing the combo from the beginning). It is guaranteed that during the m+1m+1-th try you press all buttons right and finally perform the combo.

I.e. if s=s="abca", m=2m=2 and p=[1,3]p=[1,3] then the sequence of pressed buttons will be 'a' (here you're making a mistake and start performing the combo from the beginning), 'a', 'b', 'c', (here you're making a mistake and start performing the combo from the beginning), 'a' (note that at this point you will not perform the combo because of the mistake), 'b', 'c', 'a'.

Your task is to calculate for each button (letter) the number of times you'll press it.

You have to answer tt independent test cases.

Input

The first line of the input contains one integer tt (1t1041≤t≤104) — the number of test cases.

Then tt test cases follow.

The first line of each test case contains two integers nn and mm (2n21052≤n≤2⋅105, 1m21051≤m≤2⋅105) — the length of ss and the number of tries correspondingly.

The second line of each test case contains the string ss consisting of nn lowercase Latin letters.

The third line of each test case contains mm integers p1,p2,,pmp1,p2,…,pm (1pi<n1≤pi<n) — the number of characters pressed right during the ii-th try.

It is guaranteed that the sum of nn and the sum of mm both does not exceed 21052⋅105 (n2105∑n≤2⋅105, m2105∑m≤2⋅105).

It is guaranteed that the answer for each letter does not exceed 21092⋅109.

Output

For each test case, print the answer — 2626 integers: the number of times you press the button 'a', the number of times you press the button 'b', …, the number of times you press the button 'z'.

Example
input
3
4 2
abca
1 3
10 5
codeforces
2 8 3 2 9
26 10
qwertyuioplkjhgfdsazxcvbnm
20 10 1 2 3 5 10 5 9 4
output
4 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 9 4 5 3 0 0 0 0 0 0 0 0 9 0 0 3 1 0 0 0 0 0 0 0 
2 1 1 2 9 2 2 2 5 2 2 2 1 1 5 4 11 8 2 7 5 1 10 1 5 2 这题数字可能比较大,直接遍历必然超时,我们记录每个错误的位置,在该位置之前的每个字母必然+1,倒序差分就行了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#define ll long long
const int N=1e6+10;
using namespace std;
typedef pair<int,int>PII;
int t;
int n,m;
string s;
int a[N];
int d[N];
int ans[N];
int main(){
 ios::sync_with_stdio(false);
   cin>>t;
     while(t--){
       cin>>n>>m>>s; memset(a,0,N);  memset(ans,0,N);
         for(int i=0;i<m;i++){
       int q;
       cin>>q;
       a[--q]++;
     }
     for(int i=n-2;i>=0;i--){
            a[i]+=a[i+1];
     }
     for(int i=0;i<n;i++){
        ans[s[i]-'a']+=1+a[i];
     }
     for(int i=0;i<26;i++)  cout<<ans[i]<<" ";
     cout<<endl;
     }
  return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!