求助一道站外题
  • 板块灌水区
  • 楼主Lovely_Elaina
  • 当前回复13
  • 已保存回复13
  • 发布时间2022/10/5 17:53
  • 上次更新2023/10/27 08:39:20
查看原帖
求助一道站外题
781159
Lovely_Elaina楼主2022/10/5 17:53

描述

最近你发现一个字符串s = s1s2...s ns=s1s2...sn, 由 nn 个小写字母构成,为了练习打字速度,你打算打出 ss 所有的子串 一共有n(n+1) / 2n(n+1)/2 .

ss 的子串的定义是非空字符串x = s[a...b] = s(a) s(a+1) ...s(b) (1 ≤ a ≤ b ≤ n)x=s[a...b]=s(a)s(a+1)...s(b) (1≤a≤b≤n),举个例子”auto”和”ton”都是”automaton” 的子串.

在打字进行了一会之后,你发现键盘坏了,你的键盘只能打出 kk 种小写字符c1,c2,...,c kc1,c2,...,ck

你想知道在这样的情况下,你还能打出多少个子串来

输入

第一行输入两个整数n,kn,k (1 ≤ n ≤ 2∗10^5,1 ≤ k ≤ 261≤n≤2∗10 5 ,1≤k≤26)

第二行输入一个长度为 nn 的字符串 ss

第三行输入 kk 个不同的小写字母,以空格隔开

输出

对于每组数据输出一个整数

#include <bits/stdc++.h>
using namespace std;
string p;
int n,m,total;
char s[200010];
int sum(int x){
    int p = 0;
    for(int i = 1; i <= x; i++){
        p += i;
    }
    return p;
}
int main(){
    scanf("%d %d\n",&n,&m);
    scanf("%s",s);
    for(int i = 0; i < m; i++){
        char c;
        cin >> c;
        p = p + c;
    }
    int k = 0;
    for(int i = 0; i < n; i++){
        if(p.find(s[i]) != string::npos){
            k++;
        }else{
            total += sum(k);
            k = 0;
        }
    }
    if(k != 0){
        total += sum(k);
    }
    printf("%d\n",total);
	return 0;
} 
2022/10/5 17:53
加载中...