poj3167- Cow Patterns
两个串相等定义为串中每一位排序后的相对大小相等。
一位相等等价于这一位前面比他小的和等于他的数的个数相等。
那么用kmp,比较的时候比较这两个个数就可以了。
一开始很瓜地想,询问一段区间内比我小和和我相等的数,得写个主席树啊。。。
实际上用个树状数组维护,kmp跑nxt的时候把跳过的部分从树状数组中删除就好了。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
using namespace std;
int n,k,S,s[N],a[N],nxt[N],l1[N],l2[N],ans[N]; template<typename T> void read(T &x) {
T f=; x=; char ch=getchar();
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} int sum[];
void add(int x,int v) {
if(!x) return;
for(int i=x;i<=;i+=(i&(-i)))
sum[i]+=v;
} int qry(int x) {
int rs=;
for(int i=x;i;i-=(i&(-i)))
rs+=sum[i];
return rs;
} void make_nxt(int n) {
memset(sum,,sizeof(sum));
For(i,,n-) {
l1[i]=qry(a[i]-);
l2[i]=qry(a[i]);
add(a[i],);
}
memset(sum,,sizeof(sum));
for(int i=,k=;i<n;i++) {
while(k&&((qry(a[i]-)!=l1[k])||(qry(a[i])!=l2[k]))) {
For(j,i-k,i-nxt[k-]-) add(a[j],-);
k=nxt[k-];
}
if((qry(a[i]-)==l1[k])||(qry(a[i])==l2[k])) k++;
nxt[i]=k;
add(a[i],);
}
} void solve(int n,int m) {
int k=; ans[]=;
memset(sum,,sizeof(sum));
For(i,,n-) {
while(k&&((qry(s[i]-)!=l1[k])||(qry(s[i])!=l2[k]))) {
For(j,i-k,i-nxt[k-]-) add(s[j],-);
k=nxt[k-];
}
if((qry(s[i]-)==l1[k])||(qry(s[i])==l2[k])) k++;
if(k==m) {
ans[++ans[]]=i-m+;
For(j,i-k+,i-nxt[k-]) add(s[j],-);
k=nxt[k-];
}
add(s[i],);
}
For(i,,ans[]) printf("%d\n",i==?ans[i]:ans[i]+);
} int main() {
#ifdef DEBUG
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
while(scanf("%d %d %d",&n,&k,&S)==) {
For(i,,n-) read(s[i]);
For(i,,k-) read(a[i]);
make_nxt(k);
solve(n,k);
}
return ;
}
/*
10 3 10
7
8
4
9
6
4
5
10
4
8 10
9
3
*/
poj3167- Cow Patterns的更多相关文章
- 【POJ 3167】Cow Patterns (KMP+树状数组)
Cow Patterns Description A particular subgroup of K (1 <= K <= 25,000) of Farmer John's cows l ...
- 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)
题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...
- BZOJ 1729: [Usaco2005 dec]Cow Patterns 牛的模式匹配
Description 约翰的N(1≤N≤100000)只奶牛中出现了K(1≤K≤25000)只爱惹麻烦的坏蛋.奶牛们按一定的顺序排队的时候,这些坏蛋总会站在一起.为了找出这些坏蛋,约翰让他的奶牛排好 ...
- POJ 3167 Cow Patterns(模式串浮动匹配)
题目链接:http://poj.org/problem?id=3167 题意:模式串可以浮动的模式匹配问题给出模式串的相对大小,需要找出模式串匹配次数和位置. 思路:统计比当前数小,和于当前数相等的, ...
- bzoj1729: [Usaco2005 dec]Cow Patterns 牛的模式匹配
Description 约翰的N(1≤N≤100000)只奶牛中出现了K(1≤K≤25000)只爱惹麻烦的坏蛋.奶牛们按一定的顺序排队的时候,这些坏蛋总会站在一起.为了找出这些坏蛋,约翰让他的 ...
- POJ 3167 Cow Patterns (KMP+前缀和)
题意:给你两串数字,长度分别为n和m,数字大小在[1,25].当后一串数字每个数字的排名位置与前一串数字(任一长度为m的子串)每个数字的排名位置一致时就完全匹配,最后求哪些位置是完全匹配的. 例如:1 ...
- SP7022 CPATTERN - Cow Patterns
本篇题解用于作者本人加深理解,也欢迎大家阅读. 这道题的正解是\(KMP\)加上树状数组,记录每一个位置前几个位置比其小的.相等的.大的数的数量,比较方式便是比较相应的数量,若相等,则匹配成功. 但是 ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- bzoj usaco 金组水题题解(2.5)
bzoj 2197: [Usaco2011 Mar]Tree Decoration 树形dp..f[i]表示处理完以i为根的子树的最小时间. 因为一个点上可以挂无数个,所以在点i上挂东西的单位花费就是 ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
随机推荐
- 原来腾迅的QQ号竟然是个int变量
今天有个人加我好友,我一点开申请界面 我惊异了.... 我擦,号码竟然是个负数,但是人物资料里面却是个正数 有编程经验的人,一眼就看得出来原因.而且一眼就看得出来,它们是什么 1857918296 + ...
- flink流的执行大致流程图
- WebApi路由机制详解
随着前后端分离的大热,WebApi在项目中的作用也是越来越重要,由于公司的原因我之前一直没有机会参与前后端分离的项目,但WebApi还是要学的呀,因为这东西确实很有用,可单独部署.与前端和App交互都 ...
- 用js判断是否是微信浏览器
//判断是否是微信浏览器的函数 function isWeiXin(){ //window.navigator.userAgent属性包含了浏览器类型.版本.操作系统类型.浏览器引擎类型等信息,这 ...
- Windows中的"簇"和Linux中的"块"是对应的
扇区是对硬盘而言,块是对文件系统而言. 簇”又称为“分配单元” ,文件系统是操作系统与驱动器之间的接口,当操作系统请求从硬盘里读取一个文件时,会请求相应的文件系统(FAT 16/32/NTFS)打开文 ...
- android 自定义shape 带阴影边框效果
在drawable 里面 建立一个 xml 直接复制 看效果 自己调试就可以 <?xml version="1.0" encoding="utf-8"?& ...
- [转]spring入门(六)【springMVC中各数据源配置】
在使用spring进行javaWeb开发的过程中,需要和数据库进行数据交换,为此要经常获取数据库连接,使用JDBC的方式获取数据库连接,使用完毕之后再释放连接,这种过程对系统资源的消耗无疑是很大的,这 ...
- [JZOJ6257] 【省选模拟8.9】修路
题目 题目大意 有一堆点,每个点都有其权值\(c_i\). 每次插入边\((u,v)\),\(u\)和\(1\)连通,\(v\)和\(1\)不连通.最后保证形成一棵树. 每次插入的时候询问\(1\)到 ...
- thinkphp empty标签
empty标签用于判断某个变量是否为空,用法: 大理石平台检验标准 <empty name="name"> name为空值 </empty> 如果判断没有赋 ...
- react diff 极简版
为什么react这么快呢 ? 因为react用了虚拟DOM: 但是每次虚拟DOM转真实DOM不也是很浪费性能吗 ? nice,所以关键点在Diff算法这里,去对比新旧DOM树,而后通过补丁去更新到真实 ...