Codeforces Round 624 C

Codeforces Round 624 C

思路:
求前綴和,循環中不要使用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]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章