# Code

#include<cstdio>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int N=100500;
int m,n,ans;
char b[N*2],a[N];
int nx[N],A[N][2],A0;
int B[N],L[N];
int max(int a,int b){return a<b?b:a;}
bool ss(int q,int l,int r)
{
l=max(l,L[q]);
if(A0==1&&l!=r+1)return 0;
if(q>A0 && l<=r+1)return 1;
if(r-l<A[q][1]-A[q][0])return 0;
if(q==A0 && a[n]!='*')
{
int w=r-(A[q][1]-A[q][0])-A[q][0];
fo(i,A[q][0],A[q][1])if(a[i]!=b[w+i])return 0;
return 1;
}
int j=A[q][0]-1;
if(B[q]>=l)return ss(q+1,B[q]+A[q][1]-A[q][0],r);
fo(i,l,r)
{
while(j>=A[q][0]&&a[j+1]!=b[i])j=nx[j];
if(a[j+1]==b[i])j++;
if(j>=A[q][1])
{
bool z=ss(q+1,i+1,r);
B[q]=z*(i-j+2);
return z;
}
}
L[q]=max(L[q],r-j);
return 0;
}
int main()
{
int q,w;char ch;
for(ch=getchar();ch<='z'&&ch>='a'||ch=='*';ch=getchar())a[++n]=ch;
a[n+1]=a[0]='*';
for(;!(ch<='z'&&ch>='a');ch=getchar());
for(;ch<='z'&&ch>='a';ch=getchar())b[++m]=ch;
fo(i,1,m)b[m+i]=b[i];
fo(i,1,n)if(a[i]!='*')
{
if(a[i-1]=='*')A[++A0][0]=i;
A[A0][1]=i;
}
fo(I,1,A0)
{
int j=A[I][0]-1;
nx[A[I][0]]=j;
fo(i,A[I][0]+1,A[I][1])
{
while(j>=A[I][0]&&a[j+1]!=a[i])j=nx[j];
if(a[j+1]==a[i])j++;
nx[i]=j;
}
}
ans=0;
if(!A0)ans=m;else
for(int i=1,j=0;i-j<=m;i++)
if(a[1]=='*')ans+=ss(1,i,i+m-1);else
{
while(j>=A[1][0]&&a[j+1]!=b[i])j=nx[j];
if(a[j+1]==b[i])j++;
if(j>=A[1][1])
{
ans+=ss(2,i+1,i-j+m);
j=nx[j];
}
}
printf("%d\n",ans);
return 0;
}

#### [CF878E]Numbers on the blackboard

2018-01-05 22:52:31

#### 【AtCoder】【AGC009D】Uninity

2018-02-17 10:58:40

#### noi2017解题报告（部分）

2017-08-07 09:28:39

#### [状压DP || 容斥 矩阵树定理] Codeforces 53E. Dead Ends

2018-01-04 11:52:50

#### BZOJ 5128([Lydsy12月赛]寻找母串-区间dp)

2018-01-09 11:06:30

#### jzoj 3427 归途与征程

2017-08-18 21:56:44

#### [JZOJ 3427] 归途与征程

2016-06-01 12:41:58

#### 【NOIP2013模拟】归途与征程

2016-05-30 19:46:03

#### 【NOIP2013模拟】归途与征程 题解+代码

2016-06-01 19:18:36

#### 归途与征程

2016-05-28 14:57:47