/*若主串长度为N,子串长度为M,暴力求解时间复杂度为O(M x N)。
KMP 算法时间复杂度O(M)+O(N)。算法最主要的就是子串的next数组的构造了。
首先生成子串的next_arr数组,这个数组长度与子串长度一致。数组中第i个
元素next_arr[i]的含义是B[i]之前的字符串B[0...i-1]中,必须以B[i-1]结尾
的后缀子串(不能包含B[0])与必须以B[0]开头的前缀子串(不能包含B[i-1])
最大匹配长度是多少,这个长度就是next_arr[i]的值。子串用处:当到第i个
元素与主串不匹配的时候,可以不一定要从子串头和主串初始匹配时的下一个
元素做起点开始匹配。因为next_arr数组记录了子串第i个元素之前的子串特性。
若子串在B[i]处于主串A[j]处不匹配,则j位置不变,下次从B[next_arr[i]]处
继续和A[j]相比。*/
#include<iostream>
#include<string>
using namespace std;
//求子串next数组
int* getnext_arr(string B)
{
int len = B.length();
int* next = new int[len];
next[0] = -1;
if(len==1)
return next;
next[1] = 0;
int pos = 2;
int cn = 0;
while(pos < len)
{
if(B[pos-1] == B[cn])
next[pos++] = ++cn;
else if(cn > 0)
cn = next[cn];
else
next[pos++] = 0;
}
return next;
}
//匹配,若能匹配,返回主串匹配起始的下标,若不能则返回-1
int getIndex(string A, string B)
{
if(A == "" || B == "" || B.length() < 1 || A.length() < B.length())
return -1;
int Ai = 0, Bi=0;
int *next = new int[B.length()];
next = getnext_arr(B);
while(Ai < A.length() && Bi < B.length())
{
if(A[Ai] == B[Bi])
{
Ai++; Bi++;
}
else if(next[Bi] == -1)
{
Ai++;
}
else
{
Bi = next[Bi];
}
}
return Bi == B.length() ? Ai - Bi : -1;
}
int main()
{
string A,B;
while(cin>> A >> B)
{
cout<<getIndex(A,B) <<endl;
}
return 0;
}