[CC-BSTRLCP]Count Binary Strings
[CC-BSTRLCP]Count Binary Strings
题目大意:
对于一个长度为\(n\)的\(\texttt0/\texttt1\)串\(S\),如果存在一个切分\(i\),使得\(S_{[1,i]}\)与\(S_{[i+1,n]}\)的LCP长度\(>k\),那么称\(i\)是\(S\)的精准切分。
如果\(S\)至少有\(m\)个精准切分,那么称\(S\)是一个切分串。
给定\(n,k,m\),求有多少长度为\(n\)的切分串。
- \(1\le T\le 5\)
- \(1\le n\le50\)
- \(0\le m\le n-1\)
- \(0\le k\le \min(10,n)\)
思路:
枚举前\(k\)位的状态\(s\),\(f[i][j][k]\)表示考虑到第\(i\)位,已经有\(j\)个精准切分,最后匹配的长度为\(k\)的方案数。
预处理每种后缀能匹配\(s\)的多长的前缀,转移时枚举最后加上\(0\)还是\(1\)即可。
时间复杂度\(\mathcal O(4^kk+2^kn^2k)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
const int N=51,K=11,M=1024,mod=1e9+7;
int f[2][N][K],g[M][K];
inline void upd(int &a,const int &b) {
(a+=b)%=mod;
}
int main() {
for(register int T=getint();T;T--) {
const int n=getint(),k=getint(),m=getint();
if(k==0) {
printf("%lld\n",(1ll<<n)%mod);
continue;
}
if(m+1==n||k*2>n) {
puts("0");
continue;
}
const int all=(1<<k)-1;
int ans=0;
for(register int s=0;s<=all/2;s++) {
int p[k+1];
for(register int i=0,t=s;i<=k;i++) {
p[k-i]=t;
t>>=1;
}
memset(f[0],0,sizeof f[0]);
for(register int t=0;t<=all;t++) {
for(register int i=1;i<=k;i++) {
int l;
for(l=i;l;l--) {
if(p[l]==(t&((1<<l)-1))) break;
}
g[t][i]=l;
}
f[0][t==s][g[t][k]]++;
}
for(register int i=k*2+1;i<=n;i++) {
const bool cur=i&1;
memset(f[cur],0,sizeof f[cur]);
for(register int j=0;j<=i;j++) {
for(register int i=0;i<=k;i++) {
for(register int b=0;b<2;b++) {
const int t=((p[i]<<1)|b)&all;
const int l=g[t][std::min(i+1,k)];
upd(f[cur][j+(l==k)][l],f[!cur][j][i]);
}
}
}
}
for(register int j=m+1;j<=n;j++) {
for(register int i=0;i<=k;i++) {
(ans+=f[n&1][j][i])%=mod;
}
}
}
printf("%d\n",(ans<<1)%mod);
}
return 0;
}
[CC-BSTRLCP]Count Binary Strings的更多相关文章
- 【Leetcode_easy】696. Count Binary Substrings
problem 696. Count Binary Substrings 题意:具有相同个数的1和0的连续子串的数目: solution1:还不是特别理解... 遍历元数组,如果是第一个数字,那么对应 ...
- A. You Are Given Two Binary Strings…
A. You Are Given Two Binary Strings… You are given two binary strings x and y, which are binary repr ...
- 696. Count Binary Substrings - LeetCode
Question 696. Count Binary Substrings Example1 Input: "00110011" Output: 6 Explanation: Th ...
- [LeetCode] Count Binary Substrings 统计二进制子字符串
Give a string s, count the number of non-empty (contiguous) substrings that have the same number of ...
- 696. Count Binary Substrings统计配对的01个数
[抄题]: Give a string s, count the number of non-empty (contiguous) substrings that have the same numb ...
- LeetCode Count Binary Substrings
原题链接在这里:https://leetcode.com/problems/count-binary-substrings/description/ 题目: Give a string s, coun ...
- [Swift]LeetCode696. 计数二进制子串 | Count Binary Substrings
Give a string s, count the number of non-empty (contiguous) substrings that have the same number of ...
- LeetCode算法题-Count Binary Substrings(Java实现)
这是悦乐书的第293次更新,第311篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第161题(顺位题号是696).给定一个字符串s,计算具有相同数字0和1的非空且连续子串 ...
- LeetCode 696 Count Binary Substrings 解题报告
题目要求 Give a string s, count the number of non-empty (contiguous) substrings that have the same numbe ...
随机推荐
- ps和AI使用过程中的易错点整理
ps:1.视图工具:1)标尺2)参考线3)网格:视图-->--显示>-->网格4)修改网格:编辑-->首选项>-->参考线.网格和切片 5)放大工具:画布中单击可放 ...
- ajax之全局函数
1.全局函数:$.each(array,function(){1,value}),通过$/jQuery直接调用 对象函数:$("#name").val(); jQuery UI:$ ...
- jdk的卸载及安装+环境变量的配置
一.卸载:在控制面板中删除.这是最基本的方式.2. 采用360安全卫士的软件卸载工具,记得将有关的注册表信息全部删除.3. 在“运行”中输入Regedit,打开注册表编辑器,找到HKEY_LOCAL_ ...
- IDEA项目的复制操作
另一种复制项目的方法 完成
- mysql 5.7 安装
linux(CentOS6.7) 环境Mysql 5.7.17安装教程分享给大家,供大家参考,具体内容如下: 1系统约定 安装文件下载目录:/data/software Mysql目录安装位置:/us ...
- webpack学习笔记--多种配置类型
除了通过导出一个 Object 来描述 Webpack 所需的配置外,还有其它更灵活的方式,以简化不同场景的配置. 下面来一一介绍它们. 导出一个 Function 在大多数时候你需要从同一份源代码中 ...
- Javascript面向对象编程:非构造函数的继承
今天是最后一个部分,介绍不使用构造函数实现"继承". 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Ch ...
- BZOJ 3745
题解: 分治好题 首先暴力显然rmq可以做到n^2 比较容易想到是以最值分治,这样在数据随机复杂度是nlogn,不随机还是n^2的 以最值分治只有做多与较小区间复杂度相同才是nlogn的 而这题里我们 ...
- 【Android】Android 代码判断是否获取ROOT权限(二)
[Android]Android 代码判断是否获取ROOT权限 方法比较简单,直接粘贴代码 /** * 判断当前手机是否有ROOT权限 * @return */ public boolean isRo ...
- zabbix实操随笔
vmware 9.0安装,vmware tools安装 fedora 15.0安装1G内存以上fedora上基本操作指令1.vmtools 共享文件在linux上安装有问题,出现找不到**.so.1之 ...