[luoguP2031] 脑力达人之分割字串(DP)
想了个4次方算法,没想到也A了,数据真是水。
其实两个字符串匹配那部分可以用kmp优化
——代码
#include <cstdio>
#include <cstring> int n, m, f[];
char s[], a[][]; inline int max(int x, int y)
{
return x > y ? x : y;
} int main()
{
int i, j, k, l, len;
scanf("%s %d", s + , &n);
for(i = ; i <= n; i++) scanf("%s", a[i] + );
m = strlen(s + );
for(i = ; i <= m; i++)
for(j = ; j <= n; j++)
{
len = strlen(a[j] + );
if(i >= len)
for(k = i; k; k--)
{
for(l = len; l; l--) if(s[k - (len - l)] ^ a[j][l]) break;
if(!l) f[i] = max(f[i], f[k - len] + );
}
}
printf("%d\n", f[m]);
return ;
}
正解
f[i] 表示前 i 个字符串的最优解
f[i] = max(f[i], f[i - 1])
f[i] = max(f[i], f[j - 1] + 1) (len[j ~ i] 为字典中出现过的单词)
len[j ~ i] 是以 j 为前缀的单词,可以用trie树搞。
——代码
#include <cstdio>
#include <cstring>
#define idx(x) x - 'a'
#define max(x, y) ((x) > (y) ? (x) : (y)) int n, cnt;
int ch[][], val[], f[];
char s[], a[]; inline void insert()
{
int i, x, now = , len = strlen(a);
for(i = ; i < len; i++)
{
x = idx(a[i]);
if(!ch[now][x]) ch[now][x] = ++cnt;
now = ch[now][x];
}
val[now]++;
} int main()
{
int i, j, len, now;
scanf("%s", s + );
scanf("%d", &n);
for(i = ; i <= n; i++)
{
scanf("%s", a);
insert();
}
len = strlen(s + );
for(i = ; i <= len; i++)
{
f[i] = max(f[i], f[i - ]);
for(j = i, now = ; ch[now][idx(s[j])] && j <= len; j++)
{
now = ch[now][idx(s[j])];
if(val[now]) f[j] = max(f[j], f[i - ] + );
}
}
printf("%d\n", f[len]);
return ;
}
[luoguP2031] 脑力达人之分割字串(DP)的更多相关文章
- P2031 脑力达人之分割字串
P2031 脑力达人之分割字串字符串dp,f[i]表示主串到第i个字符,最多能分割成多少子串.f[i]=max(f[i],f[k]+1);k是能匹配到的前一位. #include<iostrea ...
- 洛谷 P2031 脑力达人之分割字串
题目传送门 解题思路: f[i]表示到第i位可获得的最大分割次数,对于每个f[i]都可由其符合条件的前缀转移过来,条件就是当前串除了前缀的剩余字符里有所给单词,然后一看,这不是在剩余字符里找有没有所给 ...
- PHP 分割字串 Function 的速度比較(substr/sscanf/preg_match)---substr最快!
固定長度的字串(假設是 06481a63041b578d702f159f520847f8), 要照固定格式做切割, 使用 PHP 要怎麼切會比較快? 註: 要將此字串切成 => 06 / 48 ...
- 根据token分割字串
#include <iostream> #include <string> #include <cstring> int main() { const char * ...
- 【Foreign】字串变化 [DP]
字串变化 Time Limit: 10 Sec Memory Limit: 128 MB Description 定义一个(大写字母)字符串集合{S},初始时值包含一个给定的字符串S1,每次从中任意 ...
- 字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。
split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如 ...
- 【NOIP2015】字串
[NOIP2015]字串 标签: DP NOIP Description 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其 ...
- shell脚本 字串截取 正则表达式
字串处理 子串截取方法一:使用${}表达式格式:echo ${x:起始位置:长度}(起始位置编号从0开始,可省略) 方法二:使用expr substr格式:expr substr "$x&q ...
- P1279 字串距离
P1279 字串距离一看就是字符串dp,然而并不会,骗分之后爆零了.以后dp题要好好想想转移方程.f[i][j]表示是a串选了前i个字符,b串选了前j个字符的距离.显然(QAQ)f[i][j]=min ...
随机推荐
- 整理 Xamarin.Forms - Plugins
Open Source Components for Xamarin Xamarin官方整理的一些开源组件,有需要可以先到这里找 GitHub: xamarin/XamarinComponents: ...
- JavaScript--History 对象
history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能. 注意:从窗口被打开的那一刻开始记录,每个浏览器窗口.每个标签页乃至每个框架,都有自己的history ...
- WebSphere设置会话超时时间
WebSphere Application Server的会话超时时间可以在三个层面进行设置,分别为:应用程序服务器级别.应用程序级别和代码层面进行设置. 设置方式:应用程序级别级别和应用级别可以通过 ...
- poj1778 All Discs Considered
思路: 拓扑排序.贪心. 实现: #include <bits/stdc++.h> using namespace std; vector<]; int n1, n2; inline ...
- P1400 塔
题目描述 有N(2<=N<=600000)块砖,要搭一个N层的塔,要求:如果砖A在砖B上面,那么A不能比B的长度+D要长.问有几种方法,输出 答案 mod 1000000009的值. 输入 ...
- Python在云端编程之IPython notebook
Python在云端编程之IPython notebook 如果本地编程考虑到Python版本,机器位数,编译环境,科学栈安装等等繁琐的事,弄得你焦头烂额,不如移步云端,省去这些繁琐过程,在云端编程是很 ...
- JAVA环境变量配置后未变动配置失效处理
环境: Windows 7 x64 配置方案来源于教程: http://www.mamicode.com/info-detail-563355.html 配置方案出现的问题: 正确配置JAVA环境变量 ...
- 富士康的盈利秒杀99%的A股公司:3星|《三联生活周刊》2018年10期
三联生活周刊·最美的数学:天才为何成群到来(2018年10期) 本期专题是数学和成都,我都跳过去没看.其他内容也还有点意思. 总体评价3星. 以下是本期一些内容的摘抄,#号后面是kindle电子版中的 ...
- ThinkPHP---案例--实现知识管理功能
[一]准备工作 (1)数据表sp_knowledge SQL语句:知识管理数据表结构 create table sp_knowledge( id int(11) not null auto_incre ...
- "ping: unknown host www.baidu.com"问题解决方式
参考:https://blog.csdn.net/wbainngg123/article/details/51540535 在虚拟机VMware里选择桥接模式,并配置网络之后,发现ping ip地址可 ...