//
int KMP(int s[MM],int p[MM],int st,int tn,int F[MM])
{
    int i=0,j=0;
    while(i<st&&j<tn)
    {
        if(j==-1||s[i]==p[j])
        {
            i++;
            j++;
        }
        else
        {
            j=F[j];
        }
    }
    if(j==tn)
        return i-j;
    else
        return -1;
}
void Get(int p[MM],int tn,int F[MM])
{
    F[0]=-1;
    int j=0,k=-1;
    while(j<tn)
    {
        if(k==-1||p[j]==s[k])
        {
            F[++j]=++k;
        }
        else
            k=F[k];
    }
}

const int MM=1e6+5;
int st,tn;
int F[MM];
int t;
int sum;
vector<int>mathp;
void Get(const char s[],int ls,int F[])
{
    F[0]=-1;
    int j=0,k=-1;
    while(j<ls)
    {
        if(k==-1||s[j]==s[k])
        {
            F[++j]=++k;
        }
        else
            k=F[k];
    }
}
int KMP(const char s[],const char p[])//p主
{
    int ls,lt,i=0,j=0;
    ls=strlen(p);
    lt=strlen(s);
    Get(s,lt,F);
    mathp.clear();//tot=0;
    while(i<ls&&(ls-i)>=(lt-j))
    {
        while(j!=-1&&p[i]!=s[j])
            j=F[j];
        i++;
        j++;
        if(j>=lt)
        {
            mathp.push_back(i-j+1);//++tot
            j=F[j];
        }
    }
    return mathp.size();
}