[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 ...
随机推荐
- visual studio使用dos命令在生成项目时复制文件到指定目录
本人使用软件:vs2015 拷贝“项目1”的 bin目录 下, 项目配置的名称(“Release”,“Debug”)目录下,所有内容到“项目2”输出目录(存在直接覆盖): xcopy $(Soluti ...
- bzoj1770: [Usaco2009 Nov]lights 燈(折半搜索)
1770: [Usaco2009 Nov]lights 燈 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1153 Solved: 564[Submi ...
- 10.27night清北刷题班
/* 枚举每个部分的总和,利用前缀和进行检验. 如果能分成4部分就一定能分成2部分,就筛了一边素数优化.清空数组!!! */ #include<bits/stdc++.h> #define ...
- [Swift]经典解题思路:联合查找Union Find
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Django day35 redis连接池,redis-list操作,django中使用redis,支付宝支付
一:redis连接池, 二:redis-list操作, 三:django中使用redis, 四:支付宝支付
- 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛-K-Matrix Multiplication(矩阵乘法)
题目描述 In mathematics, matrix multiplication or matrix product is a binary operation that produces a m ...
- C# 生成 bmp 格式的图片
using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; usin ...
- Java&Xml教程(八)使用JDOM将Java对象转换为XML
在前面的教程中我们学习了如何使用JDOM解析和修改XML文件内容,本节介绍如何将Java对象转换为XML数据并生成文件. JDOM的Document类提供了便捷的方法创建元素和属性,XMLOutput ...
- 人人都能读懂的css3 3d小demo
css3 3d案例总结 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家.就把最近做的比较好的给大家分享下 1.旋转拼图 首先看下效果 代码主要由HTML和CSS3组成,应该说还是比较简 ...
- oa系统部署
1.配置java环境变量 新建:JAVA_HOME C:\Program Files\Java\jdk1.6.0_45 path添加 C:\Program Files\Java\jdk1.6.0_ ...