n<=1e5个数字,给m<=25000个数字做模板串,给的数字都<=25,求n个数中有多少个子串满足这样的与模板串匹配:长度与模板串相同,且子串中第一、二、三、……个数字在该子串中的排名和模板串中第一、二、三、……个数字在模板串中的排名相同,如:1 4 4 2和4 6 6 5匹配。

两串匹配--KMP。但这个题的匹配模式不同于传统的匹配模式。有点难的题,但有助于更好的理解KMP的原理。

回顾下KMP整个过程:模板串做失配函数,然后模板串中开个指针利用失配函数和原串匹配。也就是,如果我们知道“匹配”应满足什么条件,就可以完成所有的工作。

两串匹配,满足条件:一:这两串的上一串,即当前考虑的字符去掉,本来就已经匹配了;二:当前考虑的字符加入后仍满足匹配。也就是说,只要能找到一个满足条件二的计算方式就可以做了。在此题中,这个条件二可表示为:两串分别新加进来这个数字的排名相等,而数字很小,这个排名可以迅速计算。

错误!条件考虑不周。原来两串:1 2 3 5和2 3 4 5,现在串一加数字4,串二加数字5,排名相同,但是不能匹配的。究其原因,这里的“排名”不仅指小排名,而且指大排名,就是比他小的、比他大的数量都一样。但实际上不必这样,因为总数-小排名-大排名=这个数字出现次数,总数肯定是一样的,所以只要小排名和这个数字出现次数一样即可。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<stdlib.h>
 5 //#include<math.h>
 6 //#include<iostream>
 7 using namespace std;
 8
 9 int n,m,T;
10 #define maxn 100011
11 int a[maxn],sa[maxn][30],b[maxn],sb[maxn][30],fail[maxn];
12 bool equal(int* s1,int sa[][30],int x,int* s2,int sb[][30],int y)
13 {
14     int x1=0,x2=0,y1=0,y2=0;
15     for (int i=0;i<s1[x];i++) x1+=sa[x][i]-sa[x-y][i];
16     for (int i=0;i<s2[y];i++) y1+=sb[y][i];
17     x2=sa[x][s1[x]]-sa[x-y][s1[x]],y2=sb[y][s2[y]];
18     return (x1==y1 && x2==y2);
19 }
20 void makef()
21 {
22     fail[1]=fail[2]=1;
23     for (int i=2;i<=m;i++)
24     {
25         int j=fail[i];
26         while (j>1 && !equal(b,sb,i,b,sb,j)) j=fail[j];
27         fail[i+1]=equal(b,sb,i,b,sb,j)?j+1:1;
28     }
29 }
30 int ans[maxn],lans=0;
31 int main()
32 {
33     scanf("%d%d%d",&n,&m,&T);
34     memset(sa[0],0,sizeof(sa[0]));
35     for (int i=1;i<=n;i++)
36     {
37         scanf("%d",&a[i]);
38         for (int j=0;j<26;j++) sa[i][j]=sa[i-1][j];
39         sa[i][a[i]]++;
40     }
41     memset(sb[0],0,sizeof(sb[0]));
42     for (int i=1;i<=m;i++)
43     {
44         scanf("%d",&b[i]);
45         for (int j=0;j<26;j++) sb[i][j]=sb[i-1][j];
46         sb[i][b[i]]++;
47     }
48     makef();
49     int j=1;
50     for (int i=1;i<=n;i++)
51     {
52         while (j>1 && !equal(a,sa,i,b,sb,j)) j=fail[j];
53         if (equal(a,sa,i,b,sb,j)) j++;
54         if (j>m)
55         {
56             ans[++lans]=i-m+1;
57             j=fail[j];
58         }
59     }
60     printf("%d\n",lans);
61     for (int i=1;i<=lans;i++) printf("%d\n",ans[i]);
62     return 0;
63 }

View Code

转载于:https://www.cnblogs.com/Blue233333/p/7623410.html

BZOJ1729: [Usaco2005 dec]Cow Patterns 牛的模式匹配相关推荐

  1. bzoj 1673: [Usaco2005 Dec]Scales 天平(DFS)

    1673: [Usaco2005 Dec]Scales 天平 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 695  Solved: 253 [Subm ...

  2. bzoj 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚(DP)

    1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 941  Solved ...

  3. 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 DP + 线段树 / SPFA

    1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 975  Solved ...

  4. bzoj 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐(暴力DFS)

    1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 774  Solved: 480 ...

  5. usaco Cow Tours 牛的旅行

    Cow Tours 牛的旅行 农民 John 的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场. 但是就目前而言,你能看到至少有两个牧区不连通.这样,农民 John 就有 ...

  6. bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼声*

    bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼声 题意: N只牛,每只牛都与其他N-1只牛聊着天.一个对话的进行,需要两只牛都按照和她们间距离等大的音量吼叫,计算音量和.N ...

  7. bzoj 3388: [Usaco2004 Dec]Cow Ski Area雪场缆车(Tarjan)

    3388: [Usaco2004 Dec]Cow Ski Area雪场缆车 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 108  Solved: 4 ...

  8. 后缀数组2.0--Height数组(bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式)

    前置技能:后缀数组 height[i]:排名第i的后缀与排名第i-1的后缀的最长公共前缀,也就是sa[i]和sa[i-1]的最长公共前缀 h[i]:以第i个字符为起点的后缀与排名在它前1名的后缀的最长 ...

  9. bzoj 1671: [Usaco2005 Dec]Knights of Ni 骑士(BFS)

    1671: [Usaco2005 Dec]Knights of Ni 骑士 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 416  Solved: 26 ...

最新文章

  1. 数据元素和数据项的区别
  2. ARM中C语言和汇编语言的混合编程
  3. SpringCloud(1) 架构演进和基础知识简介
  4. Contiki系统介绍
  5. nfs服务器远程访问,NFS远程共享存储
  6. jQuery LigerUI 使用教程表格篇(1)
  7. 关于java中的位运算
  8. 漫画:分布式缓存服务器扛不住了怎么办?| 技术头条
  9. 北大朱占星:顶级会议疯狂投稿下的AI现状 | 专栏
  10. mysql查球队胜场和败场sql_NBA球队_nba有哪些球队_NBA史上实力最弱的球队是哪个?用Python+SQL我们找到了答案...
  11. Failure to find com.rongpd:rpd:pom:1.0 in xxx was cached in the local repository, resolution will no
  12. office2012产品密钥
  13. 怎么彻底粉碎文件夹?文件还能恢复吗?操作过程在这里
  14. [AngularJS面面观] 16. 依赖注入 --- 注入器中如何管理对象
  15. ppt加音乐计算机一级,PPT2016背景音乐该怎么设置?
  16. @submit.native.prevent
  17. 用Java写小学生算术题
  18. java实现蒲福风级_蒲福风力级的意思_蒲福风力级是什么意思_蒲福风力级的近义词_反义词_读音-沪江在线词典...
  19. 计算机用户administer改名后,win10系统用户文件夹改名的详细步骤
  20. (SEO优化)现身说法教你如何优化百度的收录,权重,关键词排名 SEO优化(一)

热门文章

  1. Htmlt_Div+Css简介
  2. IOS数据存储 —— 1 沙盒(数据存储目录)
  3. Call for Papers | ACCV 2022在澳门等你
  4. CVPR 2021 |针对强时序依赖,即插即用、混合注意力机制的 ACTION 模块
  5. CVPR 2021 论文/代码分类汇总!持续更新中!
  6. 25-60k/m | 湃道智能招聘
  7. 开源代码准确率99%+,人脸识别问题真的被解决了吗?
  8. CV Code | 本周新出计算机视觉开源代码汇总(含实例分割、行人检测、姿态估计、神经架构搜索、超分辨率等)...
  9. 崩坏3人物模型详解—是次世代还是手绘?
  10. 【OpenCV】OpenCV函数精讲之 -- 通道合并:merge()函数