#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int nex[1000005];
void kmpNext(char *p)
{
int t = nex[0] = -1;
int n =strlen(p);
int j = 0;
while(j<n)
{
if(t<0||p[t]==p[j])
{
j++;
t++;
nex[j] = t;
}
else
t = nex[t];
}
}
int kmp(char *t,char *p)
{
kmpNext(p);
int i,j;
i = j = 0;
int m = strlen(t);
int n = strlen(p);
while(i < m&&j < n)
{
if(j<0||t[i] == p[j])
{
i++;
j++;
}
else j = nex[j];
}
if(j == n) //匹配成功 返回位置
{
return i - j +1;
}
else return -1; //匹配不成功
}
int main()
{
char p[1000005];
char t[1000005];
while(scanf("%s %s",t,p)!=EOF)
{
int r=kmp(t,p);
printf("%d\n",r);
}
return 0;
}
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int nex[1000005];
char p[1000006];
char t[1000006];
void get_next()
{
int k = nex[0] = -1;
int i = 0;
int m = strlen(p);
while(i < m)
{
if(k == -1||p[i] == p[k])
{
k++;
i++;
nex[i] = k;
}
else
k = nex[k];
}
}
int kmp()
{
int i = 0,j = 0;
get_next();
int n = strlen(t);
int m = strlen(p);
int ans = 0;
while(i < n)
{
if(j == -1||p[j] == t[i])
{
i++;
j++;
}
else
j = nex[j];
if(j == m)
{
ans++;
j = nex[j];
//j = 0; 如果是不可重叠
}
}
return ans;
}