POJ 3167 Cow Patterns(模式串浮动匹配)
题目链接: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(模式串浮动匹配)的更多相关文章
- POJ 3167 Cow Patterns (KMP+前缀和)
题意:给你两串数字,长度分别为n和m,数字大小在[1,25].当后一串数字每个数字的排名位置与前一串数字(任一长度为m的子串)每个数字的排名位置一致时就完全匹配,最后求哪些位置是完全匹配的. 例如:1 ...
- AC自动机 - 多模式串的匹配 --- HDU 3695 Computer Virus on Planet Pandora
Problem's Link Mean: 有n个模式串和一篇文章,统计有多少模式串在文章中出现(正反统计两次). analyse: 好久没写AC自动机了,回顾一下AC自动机的知识. 本题在构造文章的时 ...
- AC自动机 - 多模式串的匹配运用 --- HDU 3065
病毒侵袭持续中 Problem's Link:http://acm.hdu.edu.cn/showproblem.php?pid=3065 Mean: 略 analyse: AC自动机的运用. 这一题 ...
- POJ 3461 Oulipo(KMP,模式串在主串中出现次数 可重叠)
题意:给你两个字符串p和s,求出p在s中出现的次数. 显然,我们要先把模式串放到前面,之后主串放后面,中间隔开,这样就可以根据前缀数组的性质来求了. 我先想直接把p接到s前面,之后求Next数组对st ...
- 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)
题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...
- POJ 3461 Oulipo(模式串在主串中出现的次数)
题目链接:http://poj.org/problem?id=3461 题意:给你两个字符串word和text,求出word在text中出现的次数 思路:kmp算法的简单应用,遍历一遍text字符串即 ...
- AC自动机 - 多模式串的匹配运用 --- HDU 2896
病毒侵袭 Problem's Link:http://acm.hdu.edu.cn/showproblem.php?pid=2896 Mean: 略 analyse: AC自动机的运用,多模式串匹配. ...
- HDU-2087-剪花布条 【KMP】(求模式串的匹配个数——与已匹配的字串不交)
题目链接:https://vjudge.net/contest/220679#problem/C 剪花布条 ...
- POJ 3167 Cow Pattern ★(KMP好题)
题意 给你一个数字序列S,再给一个数字序列pattern,S和pattern中的数字都是1到s(s<=25).每个序列里的数字都有个排名,也就是第几小,现在我们要用pattern来匹配S.在本题 ...
随机推荐
- Unix/Linux环境C编程入门教程(15) BT5开发环境搭建
1. Backtrack 是处于世界领先地位的渗透测试和信息安全审计发行版本.有着上百种预先安装好的工具软件,并确定能完美运行,Backtrack5 提供了一个强大的渗透测试平台--从Web hack ...
- c++多线程编程之互斥对象(锁)的使用之----死锁
一.死锁会在什么情况发生 1.假设有如下代码 mutex; //代表一个全局互斥对象 void A() { mutex.lock(); //这里操作共享数据 B(); //这里调用B方法 mu ...
- 2016 Multi-University Training Contest 2 总结
第二次多校,出师未捷身先死 欣君看了一下09题,高呼水题,迅速码好,一A. 我看了11题,发现分奇偶讨论即可,于是按思路写好,一A. 欣君搞鼓出01题的一个公式,于是我照着写,一WA.简直不可思议,发 ...
- 面向对象程序设计-C++_课时14对象组合_课时15继承
对象组合,就是一个类的对象作为另外一个类的成员,涉及类的对象,对象是实体,玩实 继承,涉及类,类是概念,玩虚 public: 所有人都可以接触 private: 数据放private protecte ...
- 4.跟我学solr---SolrRequestHandler具体解释
概述 我们在使用solr admin在做查询的时候,能够看到Request-Hander(qt)输入栏中有"/select"这样一个uri.当我们点击查询的时候所发起的请求是这种. ...
- HTML系列(九):表单
一.表单标签form 表单标签用于申明表单,定义采集数据的范围,即<form>包含的数据将被提交到数据库上,包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单能够包 ...
- javascript 的加载方式
本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy execution),async 属 ...
- CXF 调用C#.net的WebService
原文链接:http://hi.baidu.com/pengfeiiw/blog/item/3203e29065aa3a8aa977a4d0.html 1.编写C#.net的WebService Ser ...
- Ini文件操作类
/// <summary> /// Ini文件操作类 /// </summary> public class Ini { // 声明INI文件的写操作函数 WritePriva ...
- GUI练习——列出指定目录内容
需求: 一个窗体里.在文本框输入路径后,摁回车键或者点击"转到"按钮后: 若路径合法,程序会自动在文本域里显示该路径下的文件目录:若路径非法,则弹出对话框,告之你路径非法.点击&q ...