最近你发现一个字符串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;
}