列表

详情


NC230509. Duplicate Strings

描述

给出仅包含小写字母的字符串字符串 sq 次操作,每次操作有两种类型:
1. 把当前的字符串 s 复制 k 次之后接在自己后面。
2. 询问当前字符串 s 中某个字符 c 出现的次数,答案对 取模。

请你对每个第二种类型的操作输出答案。

输入描述

第一行两个正整数 n,qn 表示字符串长度。

接下来一行一个字符串 s,仅包含小写字母。

接下来 q 行,每行第一个正整数 op 表示操作类型。

- ,则后接一个整数 k,表示把 s 复制 k 次后接在自己后面。
- ,则后接一个小写字母 c,表示求 sc 的出现次数。

输出描述

对每个询问操作输出答案。

示例1

输入:

3 3
aba
1 5
2 a
2 b

输出:

12
6

说明:

第一次操作后,字符串变为 abaabaabaabaabaaba。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 546ms, 内存消耗: 29144K, 提交时间: 2022-01-20 19:07:37

M = int(1e9 + 7)
n, q = map(int, input().split())
s = input()
f = [0] * 26
for i in range(26):
    f[i] = s.count(chr(i + 97))
for i in range(q):
    a, b = input().split()
    if int(a) ^ 1:
        print(f[ord(b) - 97])
    else:
        for i in range(26):
            f[i] = f[i] * (int(b) + 1) % M

C++ 解法, 执行用时: 104ms, 内存消耗: 1032K, 提交时间: 2022-01-21 00:17:43

#include <bits/stdc++.h>
using namespace std;
long long i,n,q,k,o,v[200];
string s,c;
int main(){
    cin>>n>>q>>s;
    for(i=0;i<n;i++)v[s[i]]++;
    while(q--){
        cin>>o;
        if(o&1){cin>>k;for(i=95;i<123;i++)(v[i]*=k+1)%=1000000007;}
        else{cin>>c;cout<<v[c[0]]<<endl;}
    }
}

Python3 解法, 执行用时: 349ms, 内存消耗: 5960K, 提交时间: 2022-01-21 11:08:44

n,q = map(int,input().split())
s = list(input())
sum = 1
num = {}
for i in s:
    num[i] = num.get(i,0)+1
for i in range(q):
    n,m = input().split()
    if n == '1':
        m = int(m)
        sum += (sum*m)%(10**9+7)
    else:
        print((num[m] * sum) % (10**9+7))

上一题