poj3167
这道题是一道kmp的扩展版的好题
一串匹配一串很容易想到kmp,但是这里的匹配要求的是两个串的名次相同
显然名次是会变的,为了方便,我们可以换一种表达
对于两个等长的串的相同位置,名次相等就是在它之前比它小的数的个数一样,和它相等的数的个数一样
这个我们可以用树状数组维护一下(当然暴力好像也行)
然后匹配就行了
var ans,a,b,sal,eq:array[..] of longint;
next:array[..] of longint;
c:array[..] of longint;
tot,k,n,m,s,i,j:longint; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; procedure work(x,p:longint);
begin
while x<=s do
begin
inc(c[x],p);
x:=x+lowbit(x);
end;
end; function ask(x:longint):longint;
begin
ask:=;
while x> do
begin
ask:=ask+c[x];
x:=x-lowbit(x);
end;
end; begin
readln(n,m,s);
for i:= to n do
readln(a[i]);
for i:= to m do //预处理
begin
readln(b[i]);
work(b[i],);
sal[i]:=ask(b[i]-);
eq[i]:=ask(b[i]);
end;
fillchar(c,sizeof(c),);
i:=;
j:=;
next[]:=;
while i<=m do
begin
if (j=) or (ask(b[i]-)=sal[j]) and (ask(b[i])=eq[j]) then
begin
inc(i);
inc(j);
next[i]:=j;
if i>m then break;
work(b[i],);
end
else begin
for k:=i-j+ to i-next[j] do // 保证匹配的串位置一样
work(b[k],-);
j:=next[j];
end;
end;
fillchar(c,sizeof(c),);
i:=;
j:=;
work(a[],);
while (i<=n) do
begin
if (j=) or (ask(a[i]-)=sal[j]) and (ask(a[i])=eq[j]) then
begin
inc(i);
inc(j);
if i<=n then
work(a[i],);
end
else begin
for k:=i-j+ to i-next[j] do
work(a[k],-);
j:=next[j];
end;
if j>m then //注意这里要找出的是所有答案
begin
for k:=i-m to i-next[j] do
work(a[k],-);
inc(tot);
ans[tot]:=i-m;
j:=next[j];
end;
end;
writeln(tot);
for i:= to tot do
writeln(ans[i]);
end.
poj3167的更多相关文章
- poj3167(kmp)
题目链接: http://poj.org/problem?id=3167 题意: 给出两串数字 s1, s2, 求主串 s1 中的 s2 匹配数并输出每个匹配的开头位置. 区间 [l, r] 是 s2 ...
- 【POJ 3167】Cow Patterns (KMP+树状数组)
Cow Patterns Description A particular subgroup of K (1 <= K <= 25,000) of Farmer John's cows l ...
随机推荐
- 动态树 Link-Cut Trees
动态树 动态树问题, 即要求我们维护一个由若干棵子结点无序的有根树组成的森林. 要求这个数据结构支持对树的分割.合并,对某个点到它的根的路径的某些操作,以及对某个点的子树进行的某些操作. 在这里我们考 ...
- HDU 4336 Card Collector(容斥)
题意:要收集n种卡片,每种卡片能收集到的概率位pi,求收集完这n种卡片的期望.其中sigma{pi} <=1; 思路:容斥原理.就是一加一减,那么如何算期望呢.如果用二进制表示,0表示未收集到, ...
- css3中允许单词内断句word-wrap和怎么处理断句word-break
首先说一下:浏览器的默认行为,在一行中几个单词 排列着,如果最后一个长单词 太长时 首先是移到下一行,如果该单词的长度大于父元素的宽度,会溢出. <!doctype html> <h ...
- java 执行sql脚本的3种方式 (ant,ibatis,ScriptRunner)
package com.unmi; import java.io.*; import org.apache.tools.ant.*; import org.apache.tools.ant.taskd ...
- Error parsing XML: not well-formed (invalid token)
从网络上或别的文件复制粘贴进来的代码有隐含格式,可将内容先粘贴进记事本清除格式,再复制粘贴进工程文件,即可解决此问题 注:1. 要使工程文件全选清空, 2. 若粘贴后刷新仍无效果,可手动输入
- SQL2008安装提示"Microsoft visual studio 2008早期之前的版本"解决(这是我认为最简单有效的方法)
作者:冰封 日期:2013-10-18 原文地址:http://www.skywj.com/thread-9230-1-1.html 在安装SQL Server的时候提示 Microsoft visu ...
- ios7--系统自带的向右滑动手势返回上一个界面
当从控制器A push到控制器B,我们返回控制器A,除了使用按钮返回 [self.navigationController pushViewController:Vc animated:YES]; 还 ...
- UITableView编写可以添加,删除,移动的物品栏(二)
MyTableViewCell.h文件(自定义ViewCell)的内容: MyTableViewCell.m的内容
- HTML网页图片滚动代码
<!--下面是向上滚动代码--> <div id=butong_net_top style=overflow:hidden;height:100;width:90;> < ...
- 水题(素数表)NYOJ素数距离
描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度.如果左右有等距离长度素数,则输出左侧的值及相应距离. 如果输入的整数本身就是素数,则输 ...