File tree 1 file changed +85
-0
lines changed
1 file changed +85
-0
lines changed Original file line number Diff line number Diff line change
1
+ // KMP algorithm for pattern searching in O(n+m)
2
+ #include < bits/stdc++.h>
3
+ #include < ext/rope>
4
+ using namespace std ;
5
+ using namespace __gnu_cxx ;
6
+
7
+ using ci = const int ;
8
+ using ld = long double ;
9
+ using llint = long long ;
10
+ using ullint = unsigned long long ;
11
+ using pii = pair <int ,int >;
12
+ using pcc = pair <char ,char >;
13
+ using pss = pair <string,string>;
14
+ using vi = vector <int >;
15
+ using vb = vector <bool >;
16
+ using vii = vi::iterator;
17
+
18
+ #define INF (1 <<30 )
19
+ #define MOD 1000000007
20
+ #define mp make_pair
21
+ #define mt make_tuple
22
+ #define all (c ) c.begin(), c.end()
23
+ #define ms (name,val ) memset(name, val, sizeof name)
24
+ #define np nullptr
25
+
26
+
27
+ int n, m;
28
+ string t, p;
29
+ vi tmp;
30
+
31
+ void buildArray ()
32
+ {
33
+ tmp.resize (m);
34
+ int i = 0 , j = 1 ;
35
+
36
+ while (j < m)
37
+ {
38
+ while (i > 0 && p[i] != p[j])
39
+ i = tmp[i-1 ];
40
+
41
+ if (p[i] == p[j])
42
+ {
43
+ tmp[j] = i+1 ;
44
+ ++i, ++j;
45
+ }
46
+ else ++j;
47
+ }
48
+ }
49
+
50
+ void KMP_Search ()
51
+ {
52
+ int i = 0 , j = 0 ;
53
+
54
+ while (i < n)
55
+ {
56
+ while (j > 0 && t[i] != p[j])
57
+ j = tmp[j-1 ];
58
+
59
+ if (t[i] == p[j])
60
+ {
61
+ ++i;
62
+ ++j;
63
+
64
+ if (j == m)
65
+ cout << i-m << ' \n ' ;
66
+ }
67
+ else ++i;
68
+ }
69
+ }
70
+
71
+ int main ()
72
+ {
73
+ ios_base::sync_with_stdio (0 );
74
+ // cin.tie(0);
75
+
76
+ cin >> t >> p;
77
+ n = t.size ();
78
+ m = p.size ();
79
+ buildArray ();
80
+ KMP_Search ();
81
+
82
+
83
+
84
+ return 0 ;
85
+ }
You can’t perform that action at this time.
0 commit comments