题意

5702 Count The Repetitions 0x50「动态规划」例题

描述

定义 conn(s,n) 为 n 个字符串 s 首尾相接形成的字符串,例如:

conn("abc",2)="abcabc"

称字符串 a 能由字符串 b 生成,当且仅当从字符串 b 中删除某些字符后可以得到字符串 a。例如“abdbec”可以生成“abc”,但是“acbbe”不能生成“abc”。

给定两个字符串 s_1 和 s_2,以及两个整数 n_1 和 n_2,求一个最大的整数 m,满足conn(conn(s_2,n_2 ),m) 能由 conn(s_1,n_1) 生成。

s_1 和 s_2 长度不超过100,n_1 和 n_2 不大于 10^6。

输入格式

本题只有1个测试点,包含多组数据。每组数据由2行组成,第一行是s2,n2,第二行是s1,n1。

输出格式

对于每组数据输出一行表示答案m。

样例输入

ab 2
acb 4
acb 1
acb 1
aa 1
aaa 3
baab 1
baba 11
aaaaa 1
aaa 20

样例输出

2
1
4
7
12

来源

https://leetcode.com/problems/count-the-repetitions/description/

        </article>

分析

发现可以求出最大的m',满足conn(s2,m')能由conn(s1,n1)生成,那么答案m=m'/n2。

由于m'≤1e8不能直接F[i,j]表示从s1[i]开始要多少字符生成conn(s2,j),观察到m'可以用二进制拆分,所以利用倍增优化。

设F[i,j]表示从s1[i]开始至少需要多少字符才能生成conn(s2,\(2^j\))。状态转移方程为:

\[F[i,j]=F[i,j-1]+F[(i+F[i,j-1])\bmod |s_1|,j-1]
\]

可以暴力预处理F[i,0]。总时间复杂度\(O(|s_2||s_1|^2+|s_1|\log(|s_1|*n_1/|s_2|))\)

代码

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
typedef long long ll;
using namespace std; string s1,s2;
int n1,n2;
ll f[100][28];
void Count_the_Repetitions(){
for(int i=0;i<s1.size();++i){
int pos=i;
f[i][0]=0;
for(int j=0;j<s2.size();++j){
int cnt=0;
while(s1[pos]!=s2[j]){
pos=(pos+1)%s1.size();
if(++cnt>=s1.size()) return cout<<0<<endl,void();
}
pos=(pos+1)%s1.size(),f[i][0]+=cnt+1;
}
}
for(int j=1;j<=27;++j)
for(int i=0;i<s1.size();++i)
f[i][j]=f[i][j-1]+f[(i+f[i][j-1])%s1.size()][j-1];
ll m=0;
for(int st=0;st<s1.size();++st){
ll x=st,ans=0;
for(int k=27;k>=0;--k)
if(x+f[x%s1.size()][k]<=s1.size()*n1)
x+=f[x%s1.size()][k],ans+=1<<k;
m=max(m,ans);
}
cout<<m/n2<<endl;
}
int main(){
ios::sync_with_stdio(0);
while(cin>>s2>>n2>>s1>>n1) Count_the_Repetitions();
return 0;
}

最新文章

  1. Augularjs-起步
  2. Java中getResourceAsStream的用法
  3. 国内CDN公共库
  4. Android 学习笔记 Service
  5. unity 开发总结
  6. C语言文件函数
  7. Android设置Activity背景为透明style
  8. Quartus14.1中Qsys创建custom component时编译出错原因
  9. 原生JSdom节点相关(非原创)
  10. Educational Codeforces Round 19
  11. go语言基本语法
  12. xml.libxml2_添加带tagname的xml文本(xmlNewTextChild)
  13. 05LaTeX学习系列之---TeX的命令行操作
  14. bootstrap 模态 modal 小例子【转】
  15. Java学习——使用final修饰符
  16. 微信小程序开发学习资料
  17. stat用法:获取文件对应权限的数字
  18. UnityEditor扩展-Shader浏览器
  19. [洛谷P4819][中山市选]杀人游戏
  20. IntelliJ IDEA 2018.3 安装+永久激活[Windows]

热门文章

  1. Linux服务器超简单安装Python3环境、Ipython、Jupyter、virtualenv、virtualenvwrapper教程全在这了
  2. PHP isset 和 array_key_exists 对比
  3. ajax全选、全不选、反选、单删/批删
  4. redis-server 使用
  5. 2017 Russian Code Cup (RCC 17), Final Round
  6. Angular 学习笔记 (久久没有写 angular 常会忘记的小细节)
  7. Openstack中查看虚拟机console log的几种方法
  8. php 中swoole安装
  9. Hadoop经典案例(排序&amp;Join&amp;topk&amp;小文件合并)
  10. 大家多开发点uwp吧