next_permutation() 函数:
next_permutation() 函数是 C++ 标准库 <algorithm> 中的一部分,用于生成当前序列的下一个字典序排列。如果当前序列可以生成下一个更大的排列,则返回 true,并更新序列;否则返回 false,表示已经是最后一个排列。
- 该函数通常与
sort() 结合使用,因为它依赖于序列的字典序来生成下一个排列。
do-while 循环:
do-while 循环是一种循环结构,它先执行循环体,然后检查循环条件。这与 while 循环不同,后者是先检查条件再执行循环体。
- 在这段代码中,
do-while 循环确保至少执行一次循环体,然后在每次循环结束后调用 next_permutation() 来获取下一个排列,直到所有排列都被遍历完。
#include <bits/stdc++.h>
using namespace std;
int main ()
{
int n, k;
cin >> n >> k; // 输入整数 n 和 k
string s;
cin >> s; // 输入字符串 s
sort(s.begin(), s.end()); // 将字符串 s 排序
int ans = 0; // 初始化答案计数器为 0
do {
bool c = true; // 布尔变量 c 标记当前排列是否满足条件
// 遍历字符串 s 中所有可能的起始位置 i
for (int i = 0; i <= s.size() - k; i++) {
string a = s.substr(i, k); // 提取长度为 k 的子串 a
string b = a; // 创建 b 为 a 的副本
reverse(a.begin(), a.end()); // 反转字符串 a
// 如果 a 等于它的反转 b,则子串是回文串,将 c 置为 false
if (a == b) {
c = false;
}
}
// 如果 c 为 true,说明当前排列满足所有子串不是回文串的条件,答案计数器加一
if (c) {
ans++;
}
} while (next_permutation(s.begin(), s.end())); // 获取 s 的下一个排列
cout << ans << endl; // 输出满足条件的排列数
return 0;
}