ztr loves substring

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

Total Submission(s): 219    Accepted Submission(s): 119

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
由于字符串的长度只有100,所以我们可以用暴力求所有的回文子串,可以动态规划去求。
然后就可以用多重二维费用背包来处理,这里不需要用单调队列优化,不会超时,另外如果K>L直接是False
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <stdio.h>
#include <math.h> using namespace std;
int dp[105][105];
int bp[105][105];
int v[105];
int c[105];
char a[105];
int n,K,L;
void OneZeroPack(int v,int w)
{
for(int i=K;i>=1;i--)
{
for(int j=L;j>=v;j--)
{
bp[i][j]=max(bp[i][j],bp[i-1][j-v]+w);
}
}
}
void CompletePack(int v,int w)
{
for(int i=1;i<=K;i++)
{
for(int j=v;j<=L;j++)
{
bp[i][j]=max(bp[i][j],bp[i-1][j-v]+w);
}
}
}
void MulitplyPack(int v,int w,int c)
{
if(c*w>=L)
{
CompletePack(v,w);
return;
}
int k=1;
while(k<c)
{
OneZeroPack(k*v,k*w);
c-=k;
k<<=1;
}
OneZeroPack(c*v,c*w);
}
int main()
{
int t;
scanf("%d",&t);
int m;
while(t--)
{
scanf("%d%d%d",&n,&K,&L);
m=0; memset(c,0,sizeof(c));
memset(v,0,sizeof(v));
v[0]=1;
for(int i=1;i<=n;i++)
{
memset(dp,0,sizeof(dp));
for(int p=1;p<=100;p++)
dp[p][p]=1;
scanf("%s",a);
int len=strlen(a);
m=max(m,len);
c[0]+=len;
for(int l=1;l<=len-1;l++)
{
int num=0;
for(int i=0;i+l<=len-1;i++)
{
int j=i+l;
if(a[i]==a[j]&&(j-i==1||dp[i+1][j-1]==1))
{
dp[i][j]=1;
num++;
}
}
v[l]=l+1;
c[l]+=num;
}
}
memset(bp,0,sizeof(bp));
for(int i=0;i<m;i++)
{
if(c[i]==0) continue;
MulitplyPack(v[i],v[i],c[i]);
}
if(K>L)
{
printf("False\n");
continue;
}
if(bp[K][L]==L)
printf("True\n");
else
printf("False\n"); }
return 0;
}

 

HDU 5677 ztr loves substring(回文串加多重背包)的更多相关文章

  1. hdu_5677_ztr loves substring(回文+二维多重背包)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5677 题意:给你N个串,问能否选出小于K个回文字符串使得选出的字符串的长度之和为L. 题解:很容易想到 ...

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

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

  3. HDU 5677 ztr loves substring

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

  4. hdu 5677 ztr loves substring 多重背包

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

  5. Girls' research - HDU 3294 (Manacher处理回文串)

    题目大意:给以一个字符串,求出来这个字符串的最长回文串,不过这个字符串不是原串,而是转换过的,转换的原则就是先给一个字符 例如 'b' 意思就是字符把字符b转换成字符 a,那么c->b, d-& ...

  6. Harry and magic string HDU - 5157 记录不相交的回文串对数

    题意: 记录不相交的回文串对数 题解: 正着反着都来一遍回文树 用sum1[i] 表示到 i 位置,出现的回文串个数的前缀和 sun2[i]表示反着的个数 ans+=sum1[i-1]*sum2[i] ...

  7. HDU5658:CA Loves Palindromic (回文树,求区间本质不同的回文串数)

    CA loves strings, especially loves the palindrome strings. One day he gets a string, he wants to kno ...

  8. [LeetCode] Longest Palindromic Substring 最长回文串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  9. HDU 5651 计算回文串个数问题(有重复的全排列、乘法逆元、费马小定理)

    原题: http://acm.hdu.edu.cn/showproblem.php?pid=5651 很容易看出来的是,如果一个字符串中,多于一个字母出现奇数次,则该字符串无法形成回文串,因为不能删减 ...

随机推荐

  1. mongodb - Replication Set成员维护

    1.添加复制集成员 ybb:PRIMARY> rs.add("cc.example.com:27020") { "ok" : 1 } ybb:PRIMAR ...

  2. STL容器分析--map

    映射和多重映射基于某一类型Key的键集的存在,提供对T类型的数据进行快速和高效的检索.

  3. Windows Azure Platform 性能监视器(转载)

    Windows操作系统提供了查看性能监视器的功能,用于监视CPU使用率.内存使用率,硬盘读写速度,网络速度等.您可以在开始-->运行-->输入Perfmon,就可以打开性能监视器. 我们知 ...

  4. unity5, UGUI刺穿问题解法

    我希望在touch屏幕时player起跳,于是在playerControl.cs的Update函数中添加如下touch代码:  if (Input.GetMouseButtonDown (0)) {/ ...

  5. PHPCMS 后台学习

    1.final 不能被子类改写,不可扩展2.私有不能被继承3.构造方法,第一个被调用的方法4.static访问 类名::方法名 parent::test();这里test可以不静态 m=模块名& ...

  6. Freemarker自定义方法

    在项目中有一个需求,每个物品有一个guid,存在数据库中,而在页面上需要显示一个对应的业务数据值,暂且叫做serverId,serverId是通过guid移位计算得来.serverId只需要显示,后台 ...

  7. shell script 在if 的判断条件正则表达式=~中引号问题

    今天在脚本里运行if判断的时候,总是进不了对应的分支,检查正则表达式也没有错误.单独拿到shell里面执行还是显示没有匹配.比较奇怪,就搜了下,才发现是在=~ 后面的正则表达式上不能加上引号,而且以点 ...

  8. 第一周python入门

    第一编程语言的分类: 1.机器语言  二进制编程 直接操作硬件 优点:执行速度快 缺点:开发效率低   面向机器编程 2.汇编语言 英文标签代替一串特定的二进制,直接操作硬件 缺点开发效率低   面向 ...

  9. 【揭秘】什么是不对称秘钥和CA证书

    密钥交换简单的说就是利用非对称加密算法来加密对称密钥保证传输的安全性,之后用对称密钥来加密数据. ★方案1--单纯用"对称加密算法"的可行性 首先简单阐述一下,"单纯用对 ...

  10. mfc小工具开发之定时闹钟之---多线程急线程同步

    一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常 ...