T3

题目描述

给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1<k<=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)。

单词在给出的一个不超过6个单词的字典中。

要求输出最大的个数。

输入输出格式

输入格式:

每组的第一行有二个正整数(p,k)

p表示字串的行数;

k表示分为k个部分。

接下来的p行,每行均有20个字符。

再接下来有一个正整数s,表示字典中单词个数。(1<=s<=6)

接下来的s行,每行均有一个单词。

输出格式:

一个整数,分别对应每组测试数据的相应结果。

输入输出样例

输入样例#1:

1 3
thisisabookyouareaoh
4
is
a
ok
sab
输出样例#1:

7

说明

this/isabookyoua/reaoh

思路:

  我们可以用DP+KMP来处理这道题

  首先需要知道题目要求是:

      不能以同一个开头生成两个单词

  千万别理解错意思、、、

  由于在拆分字符串的过程中,如果以某位置为首某个较短单词被截断,那么以该位置为首的较长单词必然也会被截断。

    也就是说,对于各个位置来说我们选取较短的单词总不会比选取较长的单词所形成的单词少。

  那么题目就转化成了在每一个位置上选取能够形成的最短的单词,如果不能形成则为0,直接continue即可

  DP转移方程也是很好想的:

      if(dp[x][j-1])

        dp[i][j]=max(dp[i][j],dp[x][j-1]+KMP(x+1,i));//其中x是我们枚举的划分位置的前一个字符

坑点:

  注意题目要求的读入方式

上代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int L1 = ;
const int L2 = ;
int len;
char a[L1];
void init(int T) {
char c;
while(T--) {
for(int i=; i<; i++) {
scanf(" %c",&c);
a[len++]=c;
}
}
} char d[L2][L1]; //存字典
int sum,cnt;
//sum:统计一段单词中可以匹配的总个数
//cnt:字典单词总个数
int nxt[L2][L1],nowx[L2],dl[L2];
//nxt[]:开两维的原因是因为----不止一个模式串要跟文本串进行匹配
//nowx[]:每个单词当前在KMP函数中匹配的位数
//dl[]:字典中每个单词的长度
bool vis[L1]; //判重
int KMP(int l,int r) {
sum=;
memset(vis,false,sizeof(vis));
memset(nowx,,sizeof(nowx));
for(int i=l; i<=r; i++)
for(int j=; j<cnt; j++) {
while(nowx[j] && a[i]!=d[j][nowx[j]])
nowx[j]=nxt[j][nowx[j]];
if(a[i]==d[j][nowx[j]]) nowx[j]++;
if(nowx[j]==dl[j] && !vis[i-dl[j]+]) { //匹配成功
vis[i-dl[j]+]=true; //标记开头
sum++;
}
}
return sum;
} int dp[L1][L1];
int main() {
int p,k,x;
scanf("%d%d",&p,&k);
init(p);
scanf("%d",&cnt);
for(int i=; i<cnt; i++) {
scanf("%s",d[i]);
dl[i]=strlen(d[i]);
}
for(int i=; i<cnt; i++) {
x=;
nxt[i][x]=nxt[i][x+]=;
for(int j=; j<dl[i]; j++) {
while(x && d[i][x]!=d[i][j]) x=nxt[i][x];
nxt[i][j+]=d[i][x] == d[i][j] ? ++x : ;
}
}
for(int i=; i<len; i++) {
for(int j=; j<=k; j++) {
if(j==) dp[i][j]=KMP(,i);
else {
for(x=; x<i; x++)
if(dp[x][j-])
dp[i][j]=max(dp[i][j],dp[x][j-]+KMP(x+,i));
}
}
}
printf("%d",dp[len-][k]);
return ;
}

Noip2001 提高组 T3的更多相关文章

  1. 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)

    题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...

  2. JZOJ2020年8月11日提高组T3 页

    JZOJ2020年8月11日提高组T3 页 题目 Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场 ...

  3. 【GDKOI2014】JZOJ2020年8月13日提高组T3 壕壕的寒假作业

    [GDKOI2014]JZOJ2020年8月13日提高组T3 壕壕的寒假作业 题目 Description Input Output 输出n行.第i行输出两个整数,分别表示第i份作业最早完成的时刻以及 ...

  4. JZOJ2020年8月10日提高组T3 玩诈欺的小杉

    JZOJ2020年8月10日提高组T3 玩诈欺的小杉 题目 Description 是这样的,在小杉的面前有一个N行M列的棋盘,棋盘上有\(N*M\)个有黑白棋的棋子(一面为黑,一面为白),一开始都是 ...

  5. 【佛山市选2013】JZOJ2020年8月7日提高组T3 海明距离

    [佛山市选2013]JZOJ2020年8月7日提高组T3 海明距离 题目 描述 对于二进制串a,b,他们之间的海明距离是指两个串异或之后串中1的个数.异或的规则为: 0 XOR 0 = 0 1 XOR ...

  6. 【NOIP2015模拟11.5】JZOJ8月5日提高组T3 旅行

    [NOIP2015模拟11.5]JZOJ8月5日提高组T3 旅行 题目 若不存在第\(k\)短路径时,输出"Stupid Mike" 题解 题意 给出一个有\(n\)个点的树 问这 ...

  7. [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)

    最短路,这个不难想,但是要为它加边就有点麻烦..还好写完就过了(虽然WA了一次,因为我调试用的输出没删了..),不然实在是觉得挺难调的.. ------------------------------ ...

  8. 【NOIP2013提高组T3】加分二叉树

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...

  9. noip1998 提高组t3 挖地雷

    题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任一处 ...

随机推荐

  1. .NET中AOP实现

    静态织入,如:PostSharp(收费)动态织入1.使用Castle DynamicProxy不太方便的是需要在AOP的方法上加上virual关键字,配置较繁琐https://blog.csdn.ne ...

  2. Joy OI【走廊泼水节】题解--最小生成树推论变式

    题目链接: http://joyoi.org/problem/tyvj-1391 思路: 首先这需要一个推论: "给定一张无向图,若用\(k(k<n-1)\)条边构成一个生成森林(可以 ...

  3. bat实现守护程序保证平台正常运行

    1.systeminfo查看系统最近一次重启时间: 2.杀进程: :start taskkill /f /im "xx.exe" goto start "xx.exe&q ...

  4. 在textarea和input光标处插入内容,支持ie

    项目需求,用户要能够输入和点击外面的公式去插入到textaera中,试了好几种方法,有的是在谷歌下好使,在ie下不好使,最后找到了下面这个方法,目前在ie8以上都可以生效.直接上代码 function ...

  5. 巧用flex(一)

    在开发中我们经常遇到一个页面头部内容固定顶部,中间内容可滚动的需求,一般的逻辑就是把头部内容通过position以及z-index固定位置,提高层级,然后中间内容设置距离顶部一定距离,这样的效果是侧边 ...

  6. iOS7 新后台及下载SDK介绍

    在iOS7以前的系统中,App默认是不能后台运行的,如果要后台运行,可以采用以下两类方法: (1)使用beginBackgroundTaskWithExpirationHandler函数,向系统申请一 ...

  7. Marketing Cloud的contact merge机制

    Marketing Cloud的contact支持多种多样的数据源,如下图所示: SAP Hybris Commerce SAP ERP SAP Cloud for Customer SAP Gigy ...

  8. mongodb聚合查询-aggregate

    Mongodb-aggregate 在工作中经常遇到一些mongodb的聚合操作,和mysql对比起来,mongo存储的可以是复杂的类型,比如数组,字典等mysql不善于处理的文档型结构,但是mong ...

  9. PAT Basic 1088 三人行 (20 分)

    子曰:“三人行,必有我师焉.择其善者而从之,其不善者而改之.” 本题给定甲.乙.丙三个人的能力值关系为:甲的能力值确定是 2 位正整数:把甲的能力值的 2 个数字调换位置就是乙的能力值:甲乙两人能力差 ...

  10. toolbox 中创建nginx服务器,使用localhost不能访问

    使用toolbox 工具使用docker创建nginx 容器,使用localhost不能访问? 使用docker run --rm -d --name dweb  -p 80:80 nginx 命令执 ...