求助,KMP可以吗?
  • 板块题目总版
  • 楼主Vergica
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/6/10 14:48
  • 上次更新2023/10/27 23:37:45
查看原帖
求助,KMP可以吗?
697829
Vergica楼主2022/6/10 14:48

题目: T240740 [PFOI Round1 搬运] Two Repeats

代码:

#include <iostream>
#include <vector>
const int MAX = 1e9 + 7;
std::string f(std::string s)
{
    int n = s.size() / 2 + 1;
    std::string pat = s.substr(0, n), txt = s.substr(n);
    std::vector<std::vector<int>> dp(pat.size() + 1, std::vector<int>(26));
    dp[0][pat[0] - 'a'] = 1;
    for (int x = 0, i = 1; i <= pat.size(); i++) {
        for (int j = 0; j < 26; j++) dp[i][j] = dp[x][j];
        dp[i][pat[i] - 'a'] = i + 1;
        x = dp[x][pat[i] - 'a'];
    }
    int j = 0;
    for (int i = 0; i < txt.size(); i++) j = dp[j][txt[i] - 'a'];
    return s + s.substr(j, s.size() - j * 2);
}
int count(std::string txt, std::string pat)
{
    int sum = 0;
    std::vector<std::vector<int>> dp(pat.size() + 1, std::vector<int>(26));
    dp[0][pat[0] - 'a'] = 1;
    for (int x = 0, i = 1; i <= pat.size(); i++) {
        for (int j = 0; j < 26; j++) dp[i][j] = dp[x][j];
        dp[i][pat[i] - 'a'] = i + 1;
        x = dp[x][pat[i] - 'a'];
    }
    for (int j = 0, i = 0; i < txt.size(); i++) {
        j = dp[j][txt[i] - 'a'];
        if (j == pat.size()) {
            sum++;
            sum %= MAX;
            j = 0;
        }
    }
    return sum;
}
int main()
{
    std::string s, t;
    int k;
    std::cin >> s >> t >> k;
    for (int i = 0; i < k; i++) s = f(s);
    std::cout << count(s, t) << std::endl;
    return 0;
}

各位大佬能不能举个反例或者告诉我错在哪了?

2022/6/10 14:48
加载中...