题目链接: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. 字符串经典的hash算法

    1 概述 链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1). 设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无 ...

  2. 如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true

    下面这篇文章是从StackOverflow来的.LZ面试的时候遇到了一道面试题:“如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true”,于是LZ做了下面的这样的程序: bool ...

  3. rsyslog 日志格式和输出

    日志格式: $EscapeControlCharactersOnReceive off #关闭rsyslog默认转译ASCII<32的所有怪异字符,包括换行符等 $template nginx- ...

  4. 在mac上访问自带服务器权限问题

    在开发中,有时候我们需要自己的在电脑上做一些网络相关的测试功能,因此,我们必须在本地上模拟网络环境. 在模拟网络环境中,经常会遇到访问权限的问题.现在我就把自己的解决办法写出来.我用的模拟服务器站点是 ...

  5. malloc 申请得到的内存后,再 free 释放它的时候,操作系统会立即收回那块内存吗?

    stackoverflow上的回答: In many malloc/free implementations, free does normally not return the memory to  ...

  6. session.createQuery()不执行和java.lang.reflect.InvocationTargetException

    今天写SSH的工程的时候,执行到一个DAO中的Query query = session.createQuery(hql)的时候,没有成功执行,直接跳到了finally,然后前台报了500和java. ...

  7. 机器学习算法实现(R&Python code)

    Machine Learning Algorithms Machine Learning Algorithms (Python and R) 明天考试,今天就来简单写写机器学习的算法 Types Su ...

  8. Android 中延迟执行的小结

    一.开启新线程 new Thread(new Runnable(){ public void run(){ Thread.sleep(XXXX); handler.sendMessage();---- ...

  9. python自学笔记(一)简单了解python

    脚本解释型语言的内部机制 python先将脚本编译成字节码文件(pyc,pyo) python虚拟机解释并运行字节码文件 编译型语言的内部机制 先将源代码编译成机器码(机器能读懂的代码),生成可执行文 ...

  10. linux 定时执行任务

    测试可以了,做个笔记 系统是centos 6.3 1,直接命令 crontab -e 编辑文件,里面写时间和你想要执行的命令. 例子 */1 * * * * sh /home/guanliyang/t ...