Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 178    Accepted Submission(s): 93

Problem Description
ztr love reserach substring.Today ,he has n string.Now ztr want to konw,can he take out exactly k palindrome from all substring of these n string,and thrn sum of length of these k substring is L.

for example string "yjqqaq"
this string contains plalindromes:"y","j","q","a","q","qq","qaq".
so we can choose "qq" and "qaq".

 
Input
The first line of input contains an positive integer T(T<=10) indicating the number of test cases.

For each test case:

First line contains these positive integer N(1<=N<=100),K(1<=K<=100),L(L<=100).
The next N line,each line contains a string only contains lowercase.Guarantee even length of string won't more than L.

 
Output
For each test,Output a line.If can output "True",else output "False".
 
Sample Input
3
2 3 7
yjqqaq
claris
2 2 7
popoqqq
fwwf
1 3 3
aaa
 
Sample Output
False
True
True
 
Source

思路:二维费用的

#include <bits/stdc++.h>
using namespace std;
const int N = ;
const int INF = 0x3f3f3f3f;
int Ma[N << ], Mp[N << ];
char s[N];
int cnt[N]; void manacher(char s[], int len) {
int l = ;
Ma[l++] = '$';
Ma[l++] = '#';
for(int i = ; i < len; ++i)
{
Ma[l++] = s[i];
Ma[l++] = '#';
}
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) mx = i + Mp[i], id = i;
}
for(int i = ; i < l; ++i) if(Mp[i] > ) {
int p;
if(Mp[i] & ) p = ; else p = ;
for(int j = p; j < Mp[i]; j += ) cnt[j]++;
}
}
int dp[N][N];
void Dp1(int v, int k, int l) {
for(int i = v; i <= l; ++i)
for(int j = ; j <= k; ++j)
if(dp[i - v][j - ]) dp[i][j] = ;
}
void Dp2(int v, int num, int k, int l) {
for(int i = l; i >= v; --i)
for(int j = k; j >= num; --j)
if(dp[i - v][j - num]) dp[i][j] = ;
} void to(int x, int k, int l) {
if(cnt[x] >= k && x * cnt[x] >= l) Dp1(x, k, l);
else {
int s = , tot = cnt[x];
while(s < tot) {
Dp2(x * s, s, k, l);
tot -= s;
s <<= ;
}
Dp2(tot * x, tot, k, l);
}
}
bool solve(int k, int l) {
memset(dp, , sizeof dp);
dp[][] = ;
for(int i = ; i <= ; ++i) if(cnt[i]) to(i, k, l);
if(dp[l][k]) return true;
return false;
}
int main() {
// freopen("in", "r", stdin);
int _; scanf("%d", &_);
while(_ --) {
int n, k, l;
scanf("%d%d%d", &n, &k, &l);
memset(cnt, , sizeof cnt);
for(int i = ; i < n; ++i) {
scanf("%s", s);
int len = strlen(s);
manacher(s, len);
}
if(solve(k, l)) puts("True");
else puts("False");
}
return ;
}

,且二维都要求恰好装满,那么初始化[0][0]能满足,其它状态都不满足

hdu 5677 ztr loves substring 多重背包的更多相关文章

  1. HDU 5677 ztr loves substring(Manacher+dp+二进制分解)

    题目链接:HDU 5677 ztr loves substring 题意:有n个字符串,任选k个回文子串,问其长度之和能否等于L. 题解:用manacher算法求出所有回文子串的长度,并记录各长度回文 ...

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

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

  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 3732 Ahui Writes Word(多重背包)

    HDU 3732 Ahui Writes Word(多重背包) http://acm.hdu.edu.cn/showproblem.php? pid=3732 题意: 初始有N个物品, 每一个物品有c ...

  6. HDU 2082 找单词 (多重背包)

    题意:假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的 ...

  7. HDU 5445 Food Problem(多重背包+二进制优化)

    http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:现在你要为运动会提供食物,总共需要提供P能量的食物,现在有n种食物,每种食物能提供 t 能量,体积为 ...

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

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

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

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

随机推荐

  1. 使用css打造形形色色的形状!

    使用css打造形形色色的形状! css是非常强大的工具,如果我们掌握的好,那么许多复杂的形状不需要使用图片而直接使用css完成即可,这不仅有利于减少http请求以增强性能还便于日后的管理和维护,一举两 ...

  2. MVC是一个经典的设计模式

    MVC的架构:具体是模型(Model).视图(View)和控制器(Controller). MVC模式的目的是实现一种动态的程式设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能 ...

  3. U盘启动盘的制作--用U盘硬装Windows系统、或是重装Windows系统

    借助IT天空的优启通U盘启动盘的制作--用U盘装Windows系统.或是重装Windows系统之U盘启动盘的制作 1.==================================== 2.== ...

  4. 10月28日PHP基础知识测试题

    本试题共40道选择题,10道判断题,考试时间1个半小时 一:选择题(单项选择,每题2分): 1. LAMP具体结构不包含下面哪种(A) A:Windows系统 B:Apache服务器 C:MySQL数 ...

  5. React.js入门笔记(续):用React的方式来思考

    本文主要内容来自React官方文档中的"Thinking React"部分,总结算是又一篇笔记.主要介绍使用React开发组件的官方思路.代码内容经笔者改写为较熟悉的ES5语法. ...

  6. 【转】JavaWeb MVC

    -------------------------------------------------------------------------------------------------- 1 ...

  7. 数据存储_ SQLite(3)

    SQLite的应用 一.简单说明 1.在iOS中使用SQLite3,首先要添加库文件 libsqlite3.dylib 2.导入主头文件 #import <sqlite3.h> 二.具体说 ...

  8. Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended

    问题 1.在使用EntityFramework访问Mysql的时候,使用迁移来生成数据库或者更新数据库时候会遇到一些问题 2.EntityFramework.Extended对Mysql的支持不是很完 ...

  9. APP常用字体

    font-family:Microsoft YaHei,Helvitica,Verdana,Tohoma,Arial,san-serif;

  10. Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()

    下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...