#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> getNext(string p) {
vector<int> next(p.size());
int j = 0;
int k = -1;
next[0] = -1;
while (j < p.size() - 1) { //注意要小于长度减1
if (k == -1 || p[j] == p[k]) {
if (p[++j] == p[++k])
next[j] = next[k];
else
next[j] = k;
}
else
k = next[k];
}
return next;
}
int KMP(string t, string p) {
int i = 0, j = 0;
vector<int> next = getNext(p);
while ((i < t.size()) && j<(int)p.size()) {//这个地方易错,一定要强制转换,j有可能取-1,
//此时p.size和-1比较会出现小于-1,对j取绝对值比较也可以
// abs(j)<p.size() 也可以
if (j == -1 || t[i] == p[j]){
i++; j++;
}
else {
j = next[j];
}
}
if (j == p.size()) {
return i - j;
}
else
return -1;
}
int main() {
string str; //测试样例:bacbababadabaabcabdbacambabacadd
string ptr; //测试样例:abcabd
cin >> str >> ptr;
int a = KMP(str, ptr);
cout << a; //应该输出13!
return 0;
}