File tree Expand file tree Collapse file tree 1 file changed +49
-0
lines changed
Expand file tree Collapse file tree 1 file changed +49
-0
lines changed Original file line number Diff line number Diff line change 1+ #include < iostream>
2+ #include < bits/stdc++.h>
3+ using namespace std ;
4+
5+ /*
6+ * get prefix list
7+ */
8+ vector<int > computePrefix (string str) {
9+
10+ int m=int (str.length ());
11+ vector<int > prefix (m);
12+ for (int i=1 ,k=0 ;i<m;++i)
13+ {
14+ if (k>0 &&str[i]!=str[k])
15+ k=prefix[k-1 ];
16+ if (str[k]==str[i])
17+ prefix[i]=++k;
18+ else
19+ prefix[i]=k;
20+ }
21+
22+ return prefix;
23+ }
24+
25+ void KMP (string &str, string pat) {
26+ int m = int (str.length ());
27+ int n = int (pat.length ());
28+ vector<int > longestPrefix = computePrefix (pat);
29+
30+ for (int i = 0 , k = 0 ; i < m; ++i) {
31+ if (k > 0 && pat[k] != str[i])
32+ k = longestPrefix[k - 1 ];
33+ if (str[i] == pat[k])
34+ ++k;
35+ if (k == n) {
36+ cout << i - n + 1 << " \n " ;
37+ // more than one pattern
38+ k = longestPrefix[k - 1 ];
39+ }
40+
41+ }
42+ }
43+
44+ int main () {
45+ string s,p;
46+ cin>>s>>p;
47+ KMP (s,p);
48+ return 0 ;
49+ }
You can’t perform that action at this time.
0 commit comments