zoukankan      html  css  js  c++  java
  • Codeforces #624 div3 C

    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;
    }
  • 相关阅读:
    数据流图和数据流程图的定义与组成元素
    敏捷开发3种角色
    WBS
    开发流程
    结对编程
    笔记
    登录注册界面维护2----注册界面进行Toast提示
    登录注册界面修改错误
    听说
    “学习链接篇”
  • 原文地址:https://www.cnblogs.com/lr599909928/p/12378534.html
Copyright © 2011-2022 走看看