题目链接:http://poj.org/problem?id=3167

题意:模式串可以浮动的模式匹配问题给出模式串的相对大小,需要找出模式串匹配次数和位置。

思路:统计比当前数小,和于当前数相等的,然后进行kmp。

比如说模式串:1,4,4,2,3,1 而主串:5,6,2,10,10,7,3,2,9,那么2,10,10,7,3,2就是匹配的

code:

 #include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int MAXN = ;
const int MAXM = ; int a[MAXN]; // 存放主串
int b[MAXM]; // 存放模式串
int as[MAXN][]; // as[i][j] = k表示0 - i位中有k个数字j
int bs[MAXM][]; // bs[i][j] = k表示0 - i位中有k个数字j
int next[MAXM]; // 存放模式串失配时的移动位数
vector<int> ans; // 存放结果
int n, m, s; void Init()
{
ans.clear();
memset(as, , sizeof(as));
memset(bs, , sizeof(bs));
as[][a[]] = ;
bs[][b[]] = ;
for (int i = ; i <= n; ++i)
{
memcpy(as[i], as[i - ], sizeof(as[]));
++as[i][a[i]];
}
for (int i = ; i <= m; ++i)
{
memcpy(bs[i], bs[i - ], sizeof(bs[]));
++bs[i][b[i]];
}
} void GetNext()
{
memset(next, , sizeof(next));
int i = , j = , k = ;
next[] = ;
while (i <= m)
{
int si = , sj = , ei = , ej = ;
for (k = ; k < b[i]; ++k)
si += bs[i][k] - bs[i - j][k];
ei = bs[i][k] - bs[i - j][k];
for (k = ; k < b[j]; ++k)
sj += bs[j][k];
ej = bs[j][k];
if ( == j || (si == sj && ei == ej)) next[++i] = ++j;
else j = next[j];
}
} void Kmp()
{
int i = , j = , k = ;
while (i <= n)
{
int si = , sj = , ei = , ej = ;
for (k = ; k < a[i]; ++k)
si += as[i][k] - as[i - j][k];
ei = as[i][k] - as[i - j][k];
for (k = ; k < b[j]; ++k)
sj += bs[j][k];
ej = bs[j][k];
if ( == j || (si == sj && ei == ej)) ++i, ++j;
else j = next[j];
if (j == m + )
{
ans.push_back(i - m);
j = next[j];
}
}
} int main()
{
while (scanf("%d %d %d", &n, &m, &s) == )
{
for (int i = ; i <= n; ++i) scanf("%d", &a[i]);
for (int i = ; i <= m; ++i) scanf("%d", &b[i]);
Init();
GetNext();
Kmp();
size_t len = ans.size();
printf("%d\n", len);
for (size_t i = ; i < len; ++i) printf("%d\n", ans[i]);
}
return ;
}

POJ 3167 Cow Patterns(模式串浮动匹配)的更多相关文章

  1. POJ 3167 Cow Patterns (KMP+前缀和)

    题意:给你两串数字,长度分别为n和m,数字大小在[1,25].当后一串数字每个数字的排名位置与前一串数字(任一长度为m的子串)每个数字的排名位置一致时就完全匹配,最后求哪些位置是完全匹配的. 例如:1 ...

  2. AC自动机 - 多模式串的匹配 --- HDU 3695 Computer Virus on Planet Pandora

    Problem's Link Mean: 有n个模式串和一篇文章,统计有多少模式串在文章中出现(正反统计两次). analyse: 好久没写AC自动机了,回顾一下AC自动机的知识. 本题在构造文章的时 ...

  3. AC自动机 - 多模式串的匹配运用 --- HDU 3065

    病毒侵袭持续中 Problem's Link:http://acm.hdu.edu.cn/showproblem.php?pid=3065 Mean: 略 analyse: AC自动机的运用. 这一题 ...

  4. POJ 3461 Oulipo(KMP,模式串在主串中出现次数 可重叠)

    题意:给你两个字符串p和s,求出p在s中出现的次数. 显然,我们要先把模式串放到前面,之后主串放后面,中间隔开,这样就可以根据前缀数组的性质来求了. 我先想直接把p接到s前面,之后求Next数组对st ...

  5. 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)

    题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...

  6. POJ 3461 Oulipo(模式串在主串中出现的次数)

    题目链接:http://poj.org/problem?id=3461 题意:给你两个字符串word和text,求出word在text中出现的次数 思路:kmp算法的简单应用,遍历一遍text字符串即 ...

  7. AC自动机 - 多模式串的匹配运用 --- HDU 2896

    病毒侵袭 Problem's Link:http://acm.hdu.edu.cn/showproblem.php?pid=2896 Mean: 略 analyse: AC自动机的运用,多模式串匹配. ...

  8. HDU-2087-剪花布条 【KMP】(求模式串的匹配个数——与已匹配的字串不交)

    题目链接:https://vjudge.net/contest/220679#problem/C 剪花布条                                               ...

  9. POJ 3167 Cow Pattern ★(KMP好题)

    题意 给你一个数字序列S,再给一个数字序列pattern,S和pattern中的数字都是1到s(s<=25).每个序列里的数字都有个排名,也就是第几小,现在我们要用pattern来匹配S.在本题 ...

随机推荐

  1. Android消息机制不完全解析(下)

    接着上一篇文章Android消息机制不完全解析(上),接着看C++部分的实现. 首先,看看在/frameworks/base/core/jni/android_os_MessageQueue.cpp文 ...

  2. padding-bottom布局解析;

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Windows 10 : 使用BCDboot恢复双系统启动

    电脑装上win10以后,立马把原来系统的启动信息删了.结果有个软件需要反激活,但是Win10已经没有Boot.ini这样的启动配置文件. 花了好多时间查找,发现这篇文章.实际操作倒是很简单.执行以下命 ...

  4. Scala io操作

    1. 读文件 scala特有的是scala.io.Source,例如: import scala.io._ Source.fromFile(“cn.scala”,”utf8”).mkString 逐行 ...

  5. firebreath注册接口

    对firebreath文档进行翻译,顺便做个笔记,原地址:http://www.firebreath.org/display/documentation/JSAPIAuto 综述: 你可能会对需要转换 ...

  6. BZOJ 1415: [Noi2005]聪聪和可可( 最短路 + 期望dp )

    用最短路暴力搞出s(i, j)表示聪聪在i, 可可在j处时聪聪会走的路线. 然后就可以dp了, dp(i, j) = [ dp(s(s(i,j), j), j) + Σdp(s(s(i,j), j), ...

  7. JS兼容性问题列表

    记录平时遇见的兼容性问题,有更好的解决办法希望各位提出,会随着开发遇到问题而更新,标记为黄色的为未解决和猜测答案 提出时间 问题描述 解决方案 2014/10/22 submit按钮阻止了默认事件不能 ...

  8. CSS完美兼容IE6/IE7/IE8/IE9/IE10的通用方法

    关于CSS对各个浏览器兼容已经是老生常谈的问题了, 网络上的教程遍地都是.以下内容没有太多新颖, 纯属个人总结, 希望能对初学者有一定的帮助. 一.CSS HACK 以下两种方法几乎能解决现今所有HA ...

  9. less 工具

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...

  10. Centos6.4 搭建Git服务器 (最简单的方法)

    下载 git-1.8.2.tar.gz tar -zvxf git-1.8.2.tar.gz cd git-1.8.2.2 sudo make prefix=/usr/local/git all su ...