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.在本题 ...
随机推荐
- SQL数据库插入文本信息
文本内容
- xcode UIImage图片拉伸
图片拉伸 +(UIImage*)wlisWithImage:(NSString *)name{ //获取图片 UIImage * img=[UIImage imageNamed:name]; //获取 ...
- Jar包下载地址
Download Apache log4j 1.2.17下载: http://logging.apache.org/log4j/1.2/download.html jsoup http://jsoup ...
- 实现一个简单的邮箱地址爬虫(python)
我经常收到关于email爬虫的问题.有迹象表明那些想从网页上抓取联系方式的人对这个问题很感兴趣.在这篇文章里,我想演示一下如何使用python实现一个简单的邮箱爬虫.这个爬虫很简单,但从这个例子中你可 ...
- 转 --maven系列之一 简介
http://blog.csdn.net/jiuqiyuliang/article/details/41076215 [项目管理和构建]——Maven简介(一) 2015-01-31 21:27 68 ...
- Performance tool httperf
httperf: A relatively well-known open source utility developed by HP, for Linux operating systems on ...
- Notes常用事件整理
① ボタンのクリック事件: Sub Click(Source As Button) Dim ws As New NotesUIWorkspace Dim uidoc As NotesUIDo ...
- JS行合并处理方法
//行合并 function _w_table_rowspan(col){ _w_table_firsttd = ""; _w_table_currenttd = "&q ...
- Multiwii 代码解读
GPS部分 GPS_angle[ROLL] = (nav[LON]*cos_yaw_x - nav[LAT]*sin_yaw_y) /10;GPS_angle[PITCH] = (nav[LON ...
- SQL Server 储存过程的output 参数
要做的参数的回传一方面要做到有储存过程的配合,再一方面也要有调用方法的配合,也就是说错误的调用方法是没有办法把值回传的. 下面是例子 --1.储存过程方面的配合 create procedure db ...