程序猿圈子里正在流行一种很新的简写方法:
对于一个字符串,只保留首尾字符,将首尾字符之间的所有字符用这部分的长度代替。
例如 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;
}