首页 > 其他分享 >KMP模板(洛谷P3375)

KMP模板(洛谷P3375)

时间:2023-10-22 15:35:56浏览次数:38  
标签:洛谷 string ++ s2 s1 next prefix KMP P3375

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 string s1, s2;
 4 vector<int> find_next(vector<int> next, string s)
 5 {
 6     int i = 1, prefix = 0, len = s.length();
 7     while (i < len)
 8     {
 9         if (s[prefix] == s[i])
10         {
11             ++prefix, ++i;
12             next.push_back(prefix);
13         }
14         else if (prefix == 0)
15         {
16             next.push_back(0);
17             ++i;
18         }
19         else
20             prefix = next[prefix - 1];
21     }
22     return next;
23 }
24 void kmp(vector<int> next, string s1, string s2)
25 {
26     int len1 = s1.length(), len2 = s2.length();
27     int i = 0, j = 0;
28     while (i < len1)
29     {
30         while (j && s1[i] != s2[j])
31             j = next[j - 1];
32         if (s1[i] == s2[j])
33             ++j;
34         ++i;
35         if (j == len2)
36             cout << i - j + 1 << endl;
37     }
38 }
39 int main()
40 {
41     cin >> s1 >> s2;
42     vector<int> next(1);
43     next = find_next(next, s2);
44     kmp(next, s1, s2);
45     for (auto i : next)
46         cout << i << " ";
47 }

 

标签:洛谷,string,++,s2,s1,next,prefix,KMP,P3375
From: https://www.cnblogs.com/nijigasaki14/p/17780491.html

相关文章

  • 【洛谷 9240】[蓝桥杯 2023 省 B] 冶炼金属
    #[蓝桥杯2023省B]冶炼金属##题目描述小蓝有一个神奇的炉子用于将普通金属O冶炼成为一种特殊金属X。这个炉子有一个称作转换率的属性$V$,$V$是一个正整数,这意味着消耗$V$个普通金属O恰好可以冶炼出一个特殊金属X,当普通金属O的数目不足$V$时,无法继续冶炼。现......
  • 洛谷P9752
    考场上暴力100题目传送门思路考虑到\(n\)很小,于是暴力,但不是枚举每个5位数再判断,而是把所有状态的可能正解用桶存个数,然后数量为\(n\)的就是一种方案代码#include<bits/stdc++.h>usingnamespacestd;constintMaxn=10;longlongn,a[Maxn][Maxn],cnt,vis[Max......
  • 【洛谷 8665】[蓝桥杯 2018 省 A] 航班时间
    #[蓝桥杯2018省A]航班时间##题目描述小h前往美国参加了蓝桥杯国际赛。小h的女朋友发现小h上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。小h对超音速飞行感到十分恐惧。仔细观察后发现飞机的起降时间都是当地时间。由于北京......
  • 【洛谷 8772】[蓝桥杯 2022 省 A] 求和
    #[蓝桥杯2022省A]求和##题目描述给定$n$个整数$a_{1},a_{2},\cdots,a_{n}$,求它们两两相乘再相加的和,即$$S=a_{1}\cdota_{2}+a_{1}\cdota_{3}+\cdots+a_{1}\cdota_{n}+a_{2}\cdota_{3}+\cdots+a_{n-2}\cdota_{n-1}+a_{n-2}\cdota_{n}+a_{n-1}\cdota......
  • 【洛谷 8647】[蓝桥杯 2017 省 AB] 分巧克力
    #[蓝桥杯2017省AB]分巧克力##题目描述儿童节那天有$K$位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有$N$块巧克力,其中第$i$块是$H_i\timesW_i$的方格组成的长方形。为了公平起见,小明需要从这$N$块巧克力中切出$K$块巧克力分给小......
  • 【洛谷 8597】 [蓝桥杯 2013 省 B] 翻硬币
    #[蓝桥杯2013省B]翻硬币##题目背景小明正在玩一个“翻硬币”的游戏。##题目描述桌上放着排成一排的若干硬币。我们用`*`表示正面,用`o`表示反面(是小写字母,不是零),比如可能情形是`**oo***oooo`,如果同时翻转左边的两个硬币,则变为`oooo***oooo`。现在小明的问题是:如果......
  • 【模板】扩展 kmp (exkmp) / Z 函数
    求出一个字符串\(s\)的每个后缀与原串的LCP。首先由显然的SAM做法。考虑线性。考虑维护区间\([l,r]\)表示\([l,r]=[1,r-l+1]\)是最右的匹配段。考虑新的\(i\),如果满足\(l\leqi\leqr\),则\(i\)可以直接取\(i-l+1\)的答案继续扩展,否则继续扩展。最后更新区间。......
  • 洛谷 P4749 [CERC2017] Kitchen Knobs 题解
    KitchenKnobs首先,一个trivial的想法是,因为每个旋钮如果上面的数字并非全部相同则其必有唯一最优位置,故直接扔掉那些全部相同的旋钮,对于剩余的求出其最优位置。明显此位置是一\(0\sim6\)的数。因为是区间同时旋转,所以转成数之后就是区间加同一个数。一个经典套路是差分。这......
  • KMP
    fromSqStringimportSqStringMaxSize=100defGetNext(t,next): #由模式串t求出next值j,k=0,-1next[0]=-1whilej<t.getsize()-1:ifk==-1ort[j]==t[k]:#j遍历后缀,k遍历前缀j,k=j+1,k+1next[j]=kelse:k......
  • KMP模式匹配算法
    例题展示例题解决......