题目链接:HDU 5677 ztr loves substring

题意:有n个字符串,任选k个回文子串,问其长度之和能否等于L。

题解:用manacher算法求出所有回文子串的长度,并记录各长度回文子串的个数,再用背包思想判断是否有解。

dp[i][j]:选取i个回文子串,长度之和是否为j

其中用到二进制分解思想,将回文串长为i的数量cnt[i]拆成1+2+4+8+…形式,进行优化。

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define CLR(a,b) memset((a),(b),sizeof((a)))
const int N = ;
int dp[N][N], w[N*N*N], cnt[N], cnt1[N*N*N];
char s[N*];
void Manacher(char s[],int len) {
char Ma[N*];
int Mp[N*] , l = ;
CLR(Mp, );
Ma[l++] = '$'; Ma[l++] = '#';
for(int i = ; i < len; i++) {
Ma[l++] = s[i]; Ma[l++] = '#';
}
int mx = , id = ;
for(int i = ;i < l; i++) {
Mp[i] = mx > i ? min(Mp[*id-i], mx-i) : ;
while(Ma[i+Mp[i]] == Ma[i-Mp[i]]) Mp[i]++;
if(i + Mp[i] > mx) {
id = i;
mx = i + Mp[i];
}
if(Ma[i] == '#'&& Mp[i] == ) continue;
cnt[Mp[i]-]++;//记录该回文串长度数量
}
}
int main(){
int t, i, j, n, k, l, x, num;
scanf("%d", &t);
while(t--) {
scanf("%d%d%d", &n, &k, &l);
CLR(dp, ); CLR(cnt, );
for(i = ; i < n; ++i) {
scanf("%s", s);
int len = strlen(s);
Manacher(s, len);
}
num = ;
for(i = ; i <= ; ++i) {
for(j = ; j <= cnt[i]; cnt[i] -= j, j <<= ) {
w[num] = j * i;
cnt1[num++] = j;
}
if(cnt[i]) { w[num] = j * i; cnt1[num++] = j; }
}
dp[][] = ;
for(i = ; i < num; ++i)
for(j = l; j >= w[i]; --j)
for(x = cnt1[i]; x <= k; ++x)
dp[x][j] |= dp[x-cnt1[i]][j-w[i]];
if(dp[k][l]) puts("True");
else puts("False");
}
return ;
}

0ms

HDU 5677 ztr loves substring(Manacher+dp+二进制分解)的更多相关文章

  1. HDU 5677 ztr loves substring(回文串加多重背包)

    ztr loves substring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  2. hdu 5677 ztr loves substring 多重背包

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...

  3. HDU 5677 ztr loves substring

    Manacher+二维费用多重背包 二进制优化 这题是一眼标算....先计算出每个长度的回文串有几种,然后用二维费用的多重背包判断是否有解. 多重背包做的时候需要二进制优化. #include< ...

  4. [HDU5677]ztr loves substring

    ztr loves substring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  5. HDU 5675 ztr loves math (数学推导)

    ztr loves math 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/A Description ztr loves re ...

  6. HDU 5676 ztr loves lucky numbers (模拟)

    ztr loves lucky numbers 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/I Description ztr ...

  7. HDU 5675 ztr loves math

    ztr loves math Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  8. hdu 5676 ztr loves lucky numbers(dfs+离线)

    Problem Description ztr loves lucky numbers. Everybody knows that positive integers are lucky if the ...

  9. hdu 5675 ztr loves math(数学技巧)

    Problem Description ztr loves research Math.One day,He thought about the "Lower Edition" o ...

随机推荐

  1. WPF Window对象的生命周期

    WPF中所有窗口的基类型都是System.Windows.Window.Window通常用于SDI(SingleDocumentInterface).MDI(MultipleDocumentInter ...

  2. HTML5坦克大战(韩顺平版本)

    HTML5坦克大战(韩顺平版本) 2017-3-22 22:46:22 by SemiconductorKING 去年暑假学习了一下HTML5实现简单的坦克大战,觉得对JavaScript初学者来说, ...

  3. ASP.NET MVC4 新手入门教程之一 ---1.介绍ASP.NET MVC4

    你会建造 您将实现一个简单的电影清单应用程序支持创建. 编辑. 搜索和清单数据库中的电影.下面是您将构建的应用程序的两个屏幕截图.它包括显示来自数据库的电影列表的网页: 应用程序还允许您添加. 编辑和 ...

  4. JVM(五) class类文件的结构

    概述 class类文件的结构可见下面这样图(出处见参考资料),可以参照下面的例子,对应十六进制码,找出找出相应的信息. 其中u2 , u4 表示的意思是占用两个字节和占用四个字节,下面我们将会各项说明 ...

  5. mac os下载安装jmeter

    一.简介 jmeter是属于apache的一个开源产品,纯Java应用.最初用来进行功能测试,而后又扩展了更多的测试功能. 二.下载 进入apache的jmeter下载页:http://jmeter. ...

  6. 在grid结果集中实现全选或全不选某些特定的行

    在script的中的代码如下: function check(){ var id = gridgetselectvalue("require_id"); if(id.length& ...

  7. struts2 执行流程及工作原理

    在Struts2框架中的处理大概分为以下的步骤  1 用户发送请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过 ...

  8. Python基础-面向过程编程实现Linux下cat -rl ‘dir’ |grep ‘keywords’ 功能

    函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  9. 02_NIO简单实例

    [一个用NIO实现的客户端向服务端单向通信的例子] [服务端程序] package com.nio.test; import java.io.IOException; import java.net. ...

  10. 如何定位 Node.js 的内存泄漏

    基础知识 Node.js 进程的内存管理,都是有 V8 自动处理的,包括内存分配和释放.那么 V8 什么时候会将内存释放呢? 在 V8 内部,会为程序中的所有变量构建一个图,来表示变量间的关联关系,当 ...