倍增优化的DP
倍增优化的DP
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
string s1,s2;
int n1,n2;
LL f[105][32];
int main()
{
while(cin>>s2>>n2>>s1>>n1){
memset(f,0,sizeof(f));
int len1=s1.size(),len2=s2.size();
int flag=0;
for(int i=0;i<len1;++i){ //朴素处理
int pos=i;
f[i][0]=0;
for(int j=0;j<len2;++j){
int cnt=0;
while(s1[pos]!=s2[j]){
pos=(pos+1)%len1;
if((++cnt)>=len1){
printf("0\n");
flag=1;
break;
}
}
if(flag) break;
pos=(pos+1)%len1;
f[i][0]+=cnt+1;
}
if(flag) break;
}
if(flag) continue;
for(int j=1;j<=30;++j){ //预处理状态转移方程
for(int i=0;i<len1;++i){
f[i][j]=f[i][j-1]+f[(i+f[i][j-1])%len1][j-1];
}
}
LL m=0;
for(int st=0;st<len1;++st){ // 拼凑
LL x=st,ans=0;
for(int k=30;k>=