Leecoder466 Count The Repetitons

题目大意

定义\([s,n]\)为连续\(n\)个串\(s\)构成的串

现在给定\(s_1,n_1,s_2,n_2\),求最大的\(m\)满足\([[s_2,n_2],m]\)是\([s_1,n_1]\)的子序列

\(|s_1|,|s_2| \le 100,n_1,n_2\le 10^6\)

首先,\([s_2,n_2]\)我们是不能直接求出来的

但是很明显\([[s_2,n_2],m] = [s_2,n_2m]\)

所以现在我们只需要求最大的\(m'\)使得\([s_2, m']\)为\([s_1,n_1]\)的子序列

那么就有

\[m = \left\lfloor{\frac{m'}{n_2}}\right\rfloor
\]

我们发现,直接求\(m'\)是不容易实现的,因为他的上界很大,可能到达$\frac{|s_1| \times n_1}{n_2} $

考虑把\(m'\)二进制分解之后分位贪心

设\(f_{i,j}\)表示从\(s_1\)的第\(i\)位开始匹配\(2^j\)个\(s_2\)需要的字符个数

那么则有

\[f_{i,j} = f_{i,j - 1} + f_{(i + f_{i,j - 1}) \% |s_1|,j - 1}
\]

至于\(f_{i,0}\)我们可以使用最朴素的算法,直接暴力匹配,

注意判断无解的情况直接输出\(0\)就好了

这样我们就预处理完了

求答案就直接暴力枚举开头位置

然后利用倍增数组从高位向低位贪心,另外当前用了多少字符的初始值应该是\(i\)而不是\(0\)

class Solution {
int len1,len2;
char s1[505],s2[505];
long long f[31][505];
public:
int getMaxRepetitions(string S1, int n1, string S2, int n2) {
memset(f,0,sizeof(f));
len1 = S1.size();
len2 = S2.size();
for(int i = 0;i < len1;++i) s1[i] = S1[i];
for(int i = 0;i < len2;++i) s2[i] = S2[i];
// printf("%d %d\n",len1,len2);
for(int i = 0;i < len1;++i){
int pos = i;
for(int j = 0;j < len2;++j){
int cnt = 0;
while(s1[pos] != s2[j]){
pos = (pos + 1) % len1;
if(++cnt >= len1) return 0;
}
pos = (pos + 1) % len1;
f[0][i] += cnt + 1;
}
}
// for(int i = 0;i < len1;++i)printf("%d ",f[0][i]);puts("");
for(int j = 1;j <= 30;++j){
for(int i = 0;i < len1;++i){
f[j][i] = f[j - 1][i] + f[j - 1][(i + f[j - 1][i]) % len1];
}
}
long long ans = 0;
for(int i = 0;i < len1;++i){
long long t = i,sum = 0;
for(int j = 30;j >= 0;--j){
if((t + f[j][t % len1]) <= (len1) * n1){
t += f[j][t % len1];
sum += 1 << j;
}
}
//printf("%d %lld\n",i,sum);
ans = max(ans,sum);
}
return ans / n2;
}
};

Leecoder466 Count The Repetitons的更多相关文章

  1. nodejs api 中文文档

    文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格 ...

  2. C#中Length和Count的区别(个人观点)

    这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...

  3. [PHP源码阅读]count函数

    在PHP编程中,在遍历数组的时候经常需要先计算数组的长度作为循环结束的判断条件,而在PHP里面对数组的操作是很频繁的,因此count也算是一个常用函数,下面研究一下count函数的具体实现. 我在gi ...

  4. EntityFramework.Extended 实现 update count+=1

    在使用 EF 的时候,EntityFramework.Extended 的作用:使IQueryable<T>转换为update table set ...,这样使我们在修改实体对象的时候, ...

  5. 学习笔记 MYSQL报错注入(count()、rand()、group by)

    首先看下常见的攻击载荷,如下: select count(*),(floor(rand(0)*2))x from table group by x; 然后对于攻击载荷进行解释, floor(rand( ...

  6. count(*) 与count (字段名)的区别

    count(*) 查出来的是:结果集的总条数 count(字段名) 查出来的是: 结果集中'字段名'不为空的记录的总条数

  7. BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 5217  Solved: 1233 ...

  8. [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...

  9. [LeetCode] Count of Range Sum 区间和计数

    Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...

随机推荐

  1. Neo4j学习笔记(1)——使用Java API实现简单的增删改查

    阅读目录 项目的创建及配置 使用嵌入式数据库 创建节点和关系 查询及更新 删除关系和节点 完整代码 参考资料 回到顶部 项目的创建及配置 因为Neo4j依赖的jar包比较多,所以推荐使用Maven来管 ...

  2. 洛谷 P2146 [NOI2015]软件包管理器 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 输入样例#2: 输出样例#2: 说明 说明 思路 AC代码 总结 题面 题目链接 P ...

  3. hackerrank---Sets - Symmetric Difference

    题目链接 集合操作 附上代码: M = int(input()) m = set(map(int, raw_input().strip().split())) N = int(input()) n = ...

  4. 开发者总结的WatchKit App提交技巧

    苹果4月初宣布所有注册开发者已经可以向App Store提交基于WatchKit开发的Apple Watch app了,不过不少开发者遇到了模拟器中没有发现的问题.这篇文章主要收集了一些提交tips和 ...

  5. 巨蟒python全栈开发-第11阶段 ansible_project4

    1.主机的增删改查 2.初始化的增删改查 3.项目的增删改查

  6. [软考]之软件过程模型I 标签: 总结软考 2015-10-24 11:58 863人阅读 评论(35) 收藏

    做软考题的时候经常碰到软件工程的题,因为这些题有的很相近,容易混淆,所以在这里总结归纳一下. 软件过程模型: 瀑布模型: 瀑布模型是将软件生存周期中的各个活动规定为依线性顺序连接的若干阶段的模型,包括 ...

  7. Python copy(), deepcopy()

    copy() 浅拷贝: 创建一组拷贝对象的引用.切片操作相当于浅拷贝,会生成一个新的对象,新的对象里保存原对象的引用. 如果原对象中的可变对象改变(list),那么浅拷贝的对象随之改变,如果原对象中不 ...

  8. Android 使用SwipeActionAdapter开源库实现简单列表的左右滑动操作

    我们做listview左右滑动操作时,一般中情况下,都是像QQ那样,左滑弹出操作菜单(删除.编辑),然后选择菜单操作: 这样的效果不可谓不好,算是非常经典. 另外,有少数的APP,尤其是任务管理类的A ...

  9. 洛谷P2512 [HAOI2008]糖果传递

    //不开long long见祖宗!!! #include<bits/stdc++.h> using namespace std; long long n,ans,sum; ],s[]; i ...

  10. oracle函数 INSTRB(C1,C2[,I[,J]])

    [功能]在一个字符串中搜索指定的字符,返回发现指定的字符的位置; [说明]多字节符(汉字.全角符等),按2个字符计算 [参数] C1    被搜索的字符串 C2    希望搜索的字符串 I     搜 ...