HDU1686 计算模式串匹配的次数

题目大意:

输入一个T,表示有T组测试数据;

每组测试数据包括一个字符串W,T,T长度大于W小于1000000,w长度小于10000,计算W匹配到T中成功的次数;

这题很明显要用KMP算法,不然很容易超时,但在使用kmp算法时也要注意,我第一次将匹配成功的位置得到后,循环进入kmp算法,从前一个匹配到的位置开始算起,但是超时了。后来问完学长之后,清楚了,没必要循环进入kmp,直接一次可以搞定,每次模式串匹配到末尾时,都将计数+1,然后根据next[m],重新得到j继续与原串进行匹配直到进行到原串结束。

代码如下:

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 using namespace std;
 6
 7 char b[10100];
 8 char a[1000100];
 9 int next[10100];
10 int n,m,count;
11
12 void getNext(char *b)
13 {
14     int j;
15     next[0]=0,next[1]=0;
16     for(int i=1;i<m;i++){
17         j=next[i];
18         while(j&&b[j]!=b[i]) j=next[j];
19         if(b[j]==b[i]) next[i+1]=j+1;
20         else next[i+1]=0;
21     }
22 }
23
24 void kmp(char *a,char *b,int *next)
25 {
26     int j=0;
27     for(int i=0;i<n;i++){
28
29         while(j&&a[i]!=b[j]) j=next[j];
30         if(a[i]==b[j]) j++;
31         if(j==m) count++,j=next[j];
32     }
33 }
34
35 int main()
36 {
37     int T;
38     cin>>T;
39     while(T--){
40         count=0;
41         string W,T;
42         cin>>W>>T;
43         n=T.size();
44         m=W.size();
45         for(int i=0;i<n;i++){
46             a[i]=T.at(i);
47         }
48         for(int i=0;i<m;i++){
49             b[i]=W.at(i);
50         }
51
52         getNext(b);
53         kmp(a,b,next);
54         cout<<count<<endl;
55     }
56     return 0;
57 }

HDU1686 计算模式串匹配的次数

时间: 2024-10-12 11:00:54

HDU1686 计算模式串匹配的次数的相关文章

(KMP 1.2)hdu 1686 Oulipo(计算模式串在文本串中出现的次数)

题目: Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5985    Accepted Submission(s): 2404 Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition,

AC自动机——多模式串匹配的算法思想

标准KMP算法用于单一模式串的匹配,即在母串中寻求一个模式串的匹配,但是现在又存在这样的一个问题,如果同时给出多个模式串,要求找到这一系列模式串在母串存在的匹配个数,我们应该如何处理呢? 基于KMP算法,我们能够想到的一个朴素算法就是,枚举这多个模式串,然后进行多次KMP算法,这个过程中完成计数,假设这里有n个模式串,那么整个算法的复杂度大约是O(n*m),m是母串的长度,这里的时间复杂度是粗略估计,没有计算辅助数组的时间(KMP中的next数组),但是这种复杂度还是太高,没有做到KMP算法中“

SAT求解器变元活跃度计算模式的切换

变元活跃度计算模式有:VSIDS.基于历史出现时刻与当前冲突时刻距离等 有三个最小堆: // A priority queue of variables ordered with respect to the variable activity. Heap<VarOrderLt> order_heap_CHB,                                order_heap_VSIDS, order_heap_distance; 一般的求解切换方式是: conflicts

网络计算模式与比较

网络计算模式: 一.C/S模式(Client/Server,客户/服务器) 二.B/S模式(Browser/Server,浏览器/服务器) C/S模式 B/S模式 开发和维护成本 较高 较低 客户端负载 客户端需承载一定负载,可以减轻服务器负载 所有请求都需要经过服务器,对服务器要求较高 可移植性 较差,不同平台需要不同版本 较好,有浏览器就能访问 用户界面 设计者决定,定制 几乎相同 安全性 较好,协议自己定义 较差,开源协议

企业计算模式

第五节 企业计算模式 计算机应用系统中数据与应用(程序)的分布方式称为企业计算机应用系统的计算模式,有时也称为企业计算模式. 自世界上第一台计算机诞生以来, 计算机作为人类信息处理的工具已有半个多世纪了,在这个发展过程中计算机应用系统的模式发生了几次变革.计算机应用系统已经历了四种计算模式,它们分别是:单主机计算模式.分布式客户/服务器计算模式(Client/Server—C/S)和浏览器/服务器计算模式(Browser/Server—B/S) ,云计算模式.这几种计算模式的出现与计算机.网络及

python之Counter类:计算序列中出现次数最多的元素

Counter类:计算序列中出现次数最多的元素 1 from collections import Counter 2 3 c = Counter('abcdefaddffccef') 4 print('完整的Counter对象:', c) 5 6 a_times = c['a'] 7 print('元素a出现的次数:', a_times) 8 9 c_most = c.most_common(3) 10 print('出现次数最多的三个元素:', c_most) 11 12 times_dic

MapReduce 计算模式

声明:本文摘录自<大数据日知录——架构与算法>一书. 较常见的计算模式有4类,实际应用中大部分ETL任务都可以归结为这些计算模式或者变体. 1.求和模式 a.数值求和 比如我们熟悉的单词计数,即使该模式的一个应用.求最大最小值,求平均值皆属此类. b.记录求和 非数值内容的累加,形成队列.比如将包含某个key的网页添加到一个列表当中. 2.过滤模式 不对数据进行转换,只是从大量数据中筛选. a.简单过滤 这类应用不需要对数据进行聚合(原因不复杂),所以无需reduce阶段. b.Top 10

典型大数据计算模式与系统

典型大数据计算模式 典型系统 大数据查询分析计算 HBase,Hive,Cassandra,Impala,Shark,Hana等 批处理计算 Hadoop MapReduce,Spark等 流式计算 Scribe,Flume,Storm,S4, Spark Steaming等 迭代计算 HaLoop,iMapReduce,Twister,Spark等 图计算 Pregel,Giraph,Trinity,PowerGraph,GraphX等 内存计算 Dremel,Hana,Spark等

网络计算模式

两种模式的比较分析:(B/S目前比较流行) 1.开发和维护成本 B/S模式开发和维护成本比较低,因为只需要维护Web服务器就可以了,C/S模式需要维护客户端和服务器(复杂度相同,工作量差不多的情况下) 2.客户端负载 B/S模式客户端负载比较重,很多客户端不需要服务器就解决了很多事情,C/S模式所以的服务都是要经过服务器进行处理,再返回 3.可移植性 B/S模式这方面更优越,只要有个浏览器就可以再不同平台上访问.C/S模式下需要适应不同的操作系统平台,很多客户端需要针对平台做单独的开发,比如QQ