题目: 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;
}
各位大佬能不能举个反例或者告诉我错在哪了?