hdu 5677 ztr loves substring【回文Manacher+多重背包】
2016-05-07 17:07
375 查看
#include<bits/stdc++.h> using namespace std; int p[1024],g[1024]; int dp[1024][1024],N,flag,l; int main() { int _,n,k,up; scanf("%d",&_); string s; char st[1024]; while(_--) { scanf("%d%d%d",&n,&k,&l); memset(g,0,sizeof(g)); up=-1; flag=0; for(int t=0;t<n;t++) { scanf("%s",st); s="$#"; for(int i=0;st[i]!=0;i++) { s+=st[i]; s+="#"; } memset(p,0,sizeof(p)); int mx=0,id=0; int len=s.size(); for(int i=1;i<=len;i++) { if(mx>i) { p[i] = (p[2*id - i] < (mx - i) ? p[2*id - i] : (mx - i)); } else { p[i]=1; } while(s[i-p[i]]==s[i+p[i]]) p[i]++; if(i+p[i]>mx) { mx=i+p[i]; id=i; } } for(int i=1;i<=len;i++) { if(p[i]-1>up) up=p[i]-1; g[p[i]-1]++; } } N=k; memset(dp,0,sizeof(dp)); dp[0][0]=1; int cost; for(int i=1;i<=up;i++) { if(g[i]==0) continue; for(int j=1;j<=g[i];j*=2) { g[i]-=j; cost=j*i; if(cost>l) continue; for(int a=k;a>=0;a--) { if(j+a>k) continue; for(int b=l-cost;b>=0;b--) { if(dp[a][b]) dp[a+j][b+cost]=1; } } } } if(dp[k][l]==0) puts("False"); else puts("True"); } return 0; }
相关文章推荐
- 机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)
- IOS NSDate日期操作总结
- 第一章 JAVA入门(Main函数简介)
- Codeforces Beta Round #97 (Div. 1) A. Replacement 水题
- 二叉树
- 求任意范围内回文素数c++解决方案(解决了地址释放的问题,附错误原因简述)
- 十六进制的编程
- 基于R-CNN的物体检测
- 机器学习中的数学(3)-模型组合(Model Combining)之Boosting与Gradient Boosting
- poj,1273Drainage Ditches
- 《Hibernate学习笔记十》:多对多关联关系详解
- Windows安装AndroidStudio开发软件
- 16进制的转换
- IOS NSTimer 定时器用法总结
- 第一章 JAVA入门(Hello World)
- 栈与队列的互相转化
- PowerDesigner 的 COMMENT注释
- 整理音乐
- 机器学习中的数学(2)-线性回归,偏差、方差权衡
- 【jQuery/CSS】显示或隐藏元素