程序猿圈子里正在流行一种很新的简写方法:

对于一个字符串,只保留首尾字符,将首尾字符之间的所有字符用这部分的长度代替。

例如 internationalization 简写成 i18n,Kubernetes 简写成 K8s,Lanqiao 简写成 L5o 等。

在本题中,我们规定长度大于等于 K 的字符串都可以采用这种简写方法(长度小于 K 的字符串不配使用这种简写)。

给定一个字符串 S 和两个字符 c1 和 c2 ,请你计算 S 有多少个以 c1 开头 c2 结尾的子串可以采用这种简写?

输入格式 第一行包含一个整数 K 。

第二行包含一个字符串 S 和两个字符 c1 和 c2 。

输出格式 一个整数代表答案。

数据范围 对于 20% 的数据,2≤K≤|S|≤10000 。 对于 100% 的数据,2≤K≤|S|≤5×105 。S 只包含小写字母。c1 和 c2 都是小写字母。 |S| 代表字符串 S 的长度。

输入样例: 4 abababdb a b 输出样例: 6 样例解释 符合条件的子串如下所示,中括号内是该子串

[abab]abdb [ababab]db [abababdb] ab[abab]db ab[ababdb] abab[abdb]

#include using namespace std;

int N; string s1; long long ans; char c1, c2; #include

int main() {

deque<int> q1;
deque<int> q2;

cin >> N >> s1 >> c1 >> c2;

for (int i = 0; i < s1.length(); i++)
{

	if (s1[i] == c1)
		q1.push_back(i);
	 if (s1[i] == c2)
		q2.push_back(i);
}

auto temp = q2.begin();

for (auto i = q1.begin() ; i != q1.end(); i++)
{
	for (auto  w = temp; w != q2.end(); w++)
	{
		if (*w-*i>= (N - 1))
		{

			ans += q2.end() - w;
			temp = w;
				break;
		}
	}
}


cout << ans ;

return 0;

}