传送门

两个串相等定义为串中每一位排序后的相对大小相等。

一位相等等价于这一位前面比他小的和等于他的数的个数相等。

那么用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
*/

最新文章

  1. Python-2 print
  2. 45、Docker 加 tensorflow的机器学习入门初步
  3. 网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒
  4. C#保存Base64格式图片
  5. 原生DOM探究 -- NodeList v.s. HTMLCollection
  6. 44个 Javascript 变态题解析 (上\下)
  7. Hbase多master
  8. 利用Retrofit, RxJava获取网络内容
  9. git常见指令
  10. android SimpleCursorAdapter的使用
  11. javascript : detect at the end of bottom
  12. VS2017+xamain开发安卓(Addroid)应用
  13. VBS计时器2
  14. Jsop的原理
  15. sysbench压力测试工具安装及使用
  16. ant 注意
  17. 关于List Map Set的线程安全的问题
  18. java执行shell/cmd命令
  19. Linux网络编程服务器模型选择之IO复用循环并发服务器
  20. uoj#35 后缀排序(后缀数组模版)

热门文章

  1. C#中ORM的简单实现
  2. 牛客D-Where are you /// kruskal+tarjan找无向图内的环
  3. element-ui表格合计不显示&amp;被遮挡问题
  4. java oop第06章_异常处理
  5. 人脸识别-常用的数据库Face Databases From Other Research Groups
  6. 从别人git下载项目下来然后运行
  7. Delphi 第一课
  8. ReentrantLock中的公平锁与非公平锁
  9. [JZOJ3234] 阴阳
  10. 配置类一@CrossOrigin