传送门:A Simple Problem

题意

给定两个序列s1和s2,同样的数字可以用相同的别的数字代替(并且也可以是出现过的数字),问s2在s1中出现了几次。

题解

首先预处理一下这两个序列,因为数字的位置是不会变得,所以把每个数字用当前位置和前一次出现的位置的差表示,如果是第一次出现,用-1表示,这里为什么是-1呢,不能比-1更大,但可以更小,不然如果匹配的时候 j=0,那么如果 s[i]=0 这样判断的就是不是该满足的那个条件了,这样是不对的。然后就是kmp匹配了,匹配的判断条件改一下就好了,如果当前匹配上了的长度 j 比当前数字和前一次出现的位置的差( s[i] )小的话,并且当前准备匹配的那个数字( s[j] )是第一次出现,那么是可以匹配上的,相当于是把 s[j] 的数字表示成了s[i] 的数字,这样差就是一样的了。如果 j>=s[i] 的话,说明如果s[i]==s[j] 表示他们和前一次出现的位置距离是相等的,这样也是可以匹配上的。如果匹配不上,那么就 j=nt[i];

代码

 1 #include<bits/stdc++.h>
2 #define ull unsigned long long
3 #define ll long long
4 #define pb push_back
5 #define ft first
6 #define sd second
7 #define pii pair<int,int>
8 #define pll pair<ll,ll>
9 using namespace std;
10
11 const int maxn=2e5+10;
12 int s1[maxn],s2[maxn],nt[maxn],pre[maxn],pos2[maxn],pos1[maxn];
13
14 void getpre(int s[],int pos[],int n,int k)
15 {
16 for(int i=0;i<k;i++) pre[i]=-1;
17 for(int i=0;i<n;i++){
18 if(pre[s[i]]==-1) pos[i]=-1;
19 else pos[i]=i-pre[s[i]];
20 pre[s[i]]=i;
21 }
22 }
23
24 void getnt(int s[],int n)
25 {
26 int i=0,j=-1;
27 nt[0]=-1;
28 while(i<n){
29 if(j==-1||(j<s[i]?s[j]==-1:s[i]==s[j])) i++,j++,nt[i]=j;
30 else j=nt[j];
31 }
32 }
33
34 int kmp(int s[],int p[],int n,int m)
35 {
36 getnt(p,m);
37 int i=0,j=0,ans=0;
38 while(i<n){
39 if(j==-1||(j<s[i]?p[j]==-1:s[i]==p[j])) i++,j++;
40 else j=nt[j];
41 if(j==m) ans++;
42 }
43 return ans;
44 }
45
46 int main()
47 {
48 int n,k,m;
49 scanf("%d%d",&n,&k);
50 for(int i=0;i<n;i++) scanf("%d",&s1[i]);
51 scanf("%d",&m);
52 for(int i=0;i<m;i++) scanf("%d",&s2[i]);
53 getpre(s1,pos1,n,k);
54 getpre(s2,pos2,m,k);
55 printf("%d\n",kmp(pos1,pos2,n,m));
56 return 0;
57 }

牛客NC15879 A Simple Problem的更多相关文章

  1. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  2. 【牛客网】Whalyzh's Problem

    [牛客网]Whalyzh's Problem 每个\(b_{i,j}\)建一个点,认为选了\(b_{i,j}\)一定会选\(a_{i}\)和\(a_{j}\) 选了\(a_{i}\)的话会带了一个\( ...

  3. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  4. 牛客多校第十场-D- Rikka with Prefix Sum

    链接:https://www.nowcoder.com/acm/contest/148/D来源:牛客网 Prefix Sum is a useful trick in data structure p ...

  5. 2018 ACMICPC上海大都会赛重现赛 H - A Simple Problem with Integers (线段树,循环节)

    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 H - A Simple Problem with Integers (线段树,循环节) 链接:https://ac.nowcoder.co ...

  6. 牛客暑期ACM多校 第七场

    链接:https://www.nowcoder.com/acm/contest/145/C来源:牛客网 C .题目描述 A binary string s of length N = 2n is gi ...

  7. [ACM] poj 3468 A Simple Problem with Integers(段树,为段更新,懒惰的标志)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 55273   ...

  8. POJ3468 A Simple Problem with Integers 【段树】+【成段更新】

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 57666   ...

  9. 牛客网第9场多校E(思维求期望)

    链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 题目描述 Niuniu likes to play OSU! We simplify the ...

随机推荐

  1. 4.k8s存储之Volume、PV、PVC和StatefulSet

    3.Volume 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失--容器以干净的状态(镜像最初的 ...

  2. 初学java进制转换方面补充学习

    进制转换: 基础: ​ 二进制用的数为:0/1 ​ 八进制用的数为:0/1/2/3/4/5/6/7 ​ 十进制用的数为:0/1/2/3/4/5/6/7/8/9 ​ 十六进制用的数为:0/1/2/3/4 ...

  3. 【JavaWeb】JSTL 标签库

    JSTL 标签库 简介 JSTL(JSP Standard Tag Library),即 JSP 标准标签库.标签库是为了替换代码脚本,使得整个 jsp 页面变得更加简洁. JSTL 有五个功能不同的 ...

  4. docker基础总结

    搜索镜像docker search ubuntu 搜索ubuntu的Docker镜像 搜索结果单个单词ubuntu这样的镜像,被称为基础镜像或根镜像,这些基础镜像由 Docker 公司创建搜索结果ti ...

  5. git revert 回退已经push的内容

    如题,在日常的开发过程中,可能有组员不小心一下子吧文件修改,需要进行回退 回退主要涉及到2种命令,一种是git reset 一种是 git revert git reset 会修改git log提交历 ...

  6. MyBatis 查询数据时属性中多对一的问题(多条数据对应一条数据)

    数据准备 数据表 CREATE TABLE `teacher`( id INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY ( ...

  7. select 里面带的值居然是估算的?

    mysql> set profiling=1;Query OK, 0 rows affected, 1 warning (0.07 sec) mysql> select count(1) ...

  8. iconv函数报错 Detected an illegal character in input string

    近日使用php代码导出文件为excel,一直乱码.导出修改编码都无效,最后发现,是需要修改php导出代码本身的编码.首先用记事本打开php代码,另存为,选择ANSI格式.然后打开iconv函数这个ph ...

  9. ctfshow—web—web2

    打开靶机,根据提示是SQL注入 打开后看到登录窗口 方法一.手工注入 抓取数据包 开始SQL注入测试 利用万能密码,登录成功 查看回显位置 查询数据库 查询数据库内数据表 如果想整齐一点显示可以添加g ...

  10. SAP下载文档为乱码

    通过事物WE60下载的文档为乱码,主要原因是编码格式的不匹配,通常默认的编码格式为ANSI编码,那么我们需要将源码的编码格式转换成UTF-8,这样问题可以解决了.   附:编码格式介绍 不同的国家和地 ...