倍增优化的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>=0;k--){
               if(x+f[x%len1][k]<=len1*n1){
                   x+=f[x%len1][k];
                   ans+=1<<k;
              }
          }
           m=max(m,ans);
      }
       printf("%lld\n",m/n2);

  }
   return 0;
}



posted @ 2022-02-26 23:03  fengzlj  阅读(94)  评论(0)    收藏  举报