next_permutation() 函数

  1. next_permutation() 函数
    • next_permutation() 函数是 C++ 标准库 <algorithm> 中的一部分,用于生成当前序列的下一个字典序排列。如果当前序列可以生成下一个更大的排列,则返回 true,并更新序列;否则返回 false,表示已经是最后一个排列。
    • 该函数通常与 sort() 结合使用,因为它依赖于序列的字典序来生成下一个排列。
  2. 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;
}

posted @ 2024-07-22 10:43  Nijika  阅读(99)  评论(0)    收藏  举报