From ad980d856c487fb405ab4d40cba0d19b9216144e Mon Sep 17 00:00:00 2001 From: Baoshuo Date: Thu, 30 Mar 2023 08:38:49 +0800 Subject: [PATCH] =?UTF-8?q?#165.=20=E3=80=90=E6=A8=A1=E6=9D=BF=E3=80=91KMP?= =?UTF-8?q?=20=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://sjzezoj.com/submission/74730 --- S2OJ/165/165.cpp | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/S2OJ/165/165.cpp b/S2OJ/165/165.cpp index 4b0ae067..b428b6cc 100644 --- a/S2OJ/165/165.cpp +++ b/S2OJ/165/165.cpp @@ -1,28 +1,39 @@ #include -#include using std::cin; using std::cout; const char endl = '\n'; -int nxt[1000005]; -std::string s, p; +const int N = 1e6 + 5; + +int next[N]; +std::string s1, s2; int main() { - cin >> s >> p; - nxt[0] = -1; - for (int i = 1, j = -1; i < p.size(); i++) { - while (j >= 0 && p[j + 1] != p[i]) j = nxt[j]; - if (p[j + 1] == p[i]) j++; - nxt[i] = j; + std::ios::sync_with_stdio(false); + cin.tie(nullptr); + + cin >> s1 >> s2; + + next[0] = -1; + + for (int i = 1, j = -1; i < s2.size(); i++) { + while (~j && s2[j + 1] != s2[i]) j = next[j]; + + if (s2[j + 1] == s2[i]) j++; + + next[i] = j; } - for (int i = 0, j = -1; i < s.size(); i++) { - while (j != -1 && s[i] != p[j + 1]) j = nxt[j]; - if (s[i] == p[j + 1]) j++; - if (j == p.size() - 1) { + + for (int i = 0, j = -1; i < s1.size(); i++) { + while (~j && s1[i] != s2[j + 1]) j = next[j]; + + if (s1[i] == s2[j + 1]) j++; + + if (j + 1 == s2.size()) { cout << i - j + 1 << endl; - j = nxt[j]; } } + return 0; }