哇,你造吗。。。蒟蒻当年NOI这道题。。。可是拿了0分哦~(废话这么多,你弱怪我啊!)我们先kmp一次,记录下next数组及cnt数组,其中cnt表示他前面可以匹配的模式串个数。然后在类似kmp的做一次,记录下Next数组,Next == next + 长度限制。于是。。。ans = Π (cnt[...
分类:
其他好文 时间:
2014-12-01 20:42:35
阅读次数:
240
题意: 给你一个文本串,和一些模式串,每个模式串都有一个价值,让你选一些模式串来组成文本串,使获得的价值最大。每个模式串不止能用一次。思路: 多重背包,枚举文本串的每个位置和模式串,把该模式串拼接在当前位置,看下一个位置是否能得到更优值。但是,存在很多模式串不能拼在当前位置的,无效状态。所以可以.....
分类:
其他好文 时间:
2014-12-01 19:00:36
阅读次数:
228
通道:http://acm.hnu.cn/online/?action=problem&type=show&id=13108&courseid=296题意:N个匹配串及权值,求完全匹配模式串的最大值。思路:建AC自动机,dp[i]到达i的最大值,dp[i]=max(dp[i-L]+W);代码:htt...
分类:
其他好文 时间:
2014-11-29 15:52:34
阅读次数:
169
题意:给t、n,t个案例,n个字符串 下面给n+1个字符串,n个互不相同的小串,最后一个是模式串 模式串会出现[qx]的形式,q为数字,x为一个字母问n个小串在模式串中出现的个数,正着出现、反着出现都算。蛮裸的ac自动机,本来想着在query里面把找到过的end清零,把模式串展开正着反着找两遍,.....
分类:
Web程序 时间:
2014-11-25 00:03:45
阅读次数:
267
题意:
给出m个模式串,要求构造一长度为n的文本串,至少包括k种模式串,求有多少种可能的模式串。
分析:
m个模式串构建AC自动机,然后要在这AC自动机中走n步,至少经过k个单词结点。因为m<=10,显然可以用状压表示已经有哪几个单词结点。用dp[i][j][k]表示走了i步到AC自动机中的第j个结点,单词状态为k,由计数原理可推出状态转移方程:dp[i][j][k]=sum(dp[i-1][last_j][last_k]),last_j表示可以抵达第j个结点的上一个结点,last_k表示上一步的状态;因为...
分类:
其他好文 时间:
2014-11-20 12:01:10
阅读次数:
242
题意:用两个字符串分别表示布条和图案,问能从该布条上剪出多少这样的图案。分析:毫无疑问这也是用KMP匹配,关键是一次匹配完成后,模式串应该向后滑动多少。和上一题 HDU 1686 不同,两个图案肯定不能在母串中有交叉的部分,所以当匹配成功一次后,应当滑动整个模式串的长度。和上一题比,代码几乎不变,只...
分类:
其他好文 时间:
2014-11-20 06:52:11
阅读次数:
333
题意:求模式串W在母串T中出现的次数,各个匹配串中允许有重叠的部分。分析:一开始想不清楚当一次匹配完成时该怎么办,我还SB地让i回溯到某个位置上去。后来仔细想想,完全不用,直接让模式串向前滑动,即 j = next[j] 1 #include 2 #include 3 #include 4 ...
分类:
其他好文 时间:
2014-11-20 06:49:46
阅读次数:
186
8592 KMP算法
时间限制:1000MS 内存限制:1000K
题型: 编程题 语言: 无限制
描述
用KMP算法对主串和模式串进行模式匹配。本题目给出部分代码,请补全内容。
#include "stdio.h"
#include "stdlib.h"
#include "iostream.h"
#define TRUE...
分类:
编程语言 时间:
2014-11-19 22:19:25
阅读次数:
384
#include
#include
#define maxn 10010
int next[maxn];
char str[maxn], buf[maxn * 100];
void getNext() {
int i = 0, j = -1;
next[i] = j;
while(str[i]) {
if(j == -1 || str[i] == str[j]) {
++...
分类:
其他好文 时间:
2014-11-19 22:16:01
阅读次数:
176
题意:
给出N个模式串和一个文本串,问最少修改文本串中多少个字母使得文本串中不包含模式串。
分析:
N个模式串构建AC自动机,然后文本串在AC自动机中走,其中单词结点不可达。
用dp[i][j]表示文本串第i个字母转移到AC自动机第j个结点最少修改字母的个数,状态转移方程为dp[i][j]=min(dp[i][j],dp[i-1][last]+add),last表示j的前趋,add为当前点是否修改。由于第i个只和第i-1个有关,所以可以使用滚动数组来优化空间。...
分类:
其他好文 时间:
2014-11-18 13:33:10
阅读次数:
203