| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 | inline void GetNext(char *s) {int l = strlen(s), t;
 next[0] = -1;
 for (int i = 1; i < l; ++i) {
 t = next[i - 1];
 while (s[t + 1] != s[i] && t >= 0)
 t = next[t];
 if (s[t + 1] == s[i])
 next[i] = t + 1;
 else
 next[i] = -1;
 }
 }
 
 inline void KMP(char *s1, char *s2) {
 ans.clear();
 GetNext(s2);
 int len_1 = strlen(s1);
 int len_2 = strlen(s2);
 int i = 0, j = 0;
 while (j < len_1) {
 if (s2[i] == s1[j]) {
 ++i;
 ++j;
 if (i == len_2) {
 ans.push_back(j - len_2 + 1);
 i = next[i - 1] + 1;
 }
 } else {
 if (i == 0)
 j++;
 else
 i = next[i - 1] + 1;
 }
 }
 }
 
 |