zoukankan      html  css  js  c++  java
  • AW294 计算重复(倍增优化DP)

    题目地址


    状态设计:

    • f[字符串s1的开始位置][s2首尾相接的次数(2^j)](至少需要的字符数量).

    易错点:

    • 预处理f[i][0](以s1[i]为开头形成s2所需要的最小字符数量 )时直接枚举即可.

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define ll long long
    using namespace std;
    string s1,s2;
    int n1,n2;
    ll f[105][32];
    void solve(){
    	memset(f,0,sizeof(f));
    	int size1=s1.size(),size2=s2.size();
    	for(int i=0;i<size1;i++){
    		int pos=i;
    		f[i][0]=0;
    		for(int j=0;j<size2;j++){
    			int cnt=0;
    			while(s1[pos]!=s2[j]){
    				pos=(pos+1)%size1;
    				if(++cnt>=size1){
    					printf("0
    ");
    					return;
    				}
    			}
    			pos=(pos+1)%size1;
    			f[i][0]+=cnt+1;
    		}
    	}
    	for(int j=1;j<=30;j++){
    		for(int i=0;i<size1;i++){
    			f[i][j]=f[i][j-1]+f[(i+f[i][j-1])%size1][j-1];
    		}
    	}
    	ll m=0;
    	for(int st=0;st<size1;st++){
    		ll x=st,ans=0;
    		for(int k=30;k>=0;k--){
    			if(x+f[x%size1][k]<=size1*n1){
    				x+=f[x%size1][k];
    				ans+=(1<<k);
    			}
    		}
    		m=max(m,ans);
    	}
    	printf("%d
    ",m/n2);
    }
    int main(){
    	while(cin>>s2>>n2>>s1>>n1)
    		solve();
    	return 0;
    }
  • 相关阅读:
    有关TSQL中的ROUND()的用法
    孤立用户
    微小的边缘原理
    分段统计查询的方法
    虎尾兰
    有规律字段的拆分
    对索引视图的限制
    金额转换为英文大写
    经典名言
    最大信息熵原理
  • 原文地址:https://www.cnblogs.com/zbsy-wwx/p/11680552.html
Copyright © 2011-2022 走看看