COJ 1287 求匹配串在模式串中出现的次数

这里要在后缀自动机的节点中维护一个从到达当前位置出现的字符串总个数

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4
 5 using namespace std;
 6 #define N 200010
 7 #define M 26
 8
 9 struct SamNode{
10     SamNode *son[26] , *f;
11     int l , sc;
12     void init(){
13         f = NULL;
14         for(int i=0 ; i<26 ; i++) son[i] = NULL;
15         l = sc = 0;
16     }
17 }*root , *last , sam[N];
18
19 int cnt , n , m , k , ret;
20 char s[N];
21
22 void init(){
23     sam[0].init();
24     root = last = &sam[cnt=0];
25     ret = 0;
26 }
27
28 void add(int x)
29 {
30     SamNode *p = &sam[++cnt] , *jp=last;
31     p->init();
32     p->l = jp->l+1;
33     p->sc=1;
34     last = p;
35     for( ; jp&&!jp->son[x] ; jp=jp->f) jp->son[x]=p;
36     if(!jp) p->f = root;
37     else{
38         if(jp->l+1 == jp->son[x]->l) p->f = jp->son[x];
39         else{
40             SamNode *r = &sam[++cnt] , *q = jp->son[x];
41             r->init();
42             *r = *q;
43             r->l = jp->l+1;
44             q->f = p->f = r;
45             for( ; jp && jp->son[x]==q ; jp=jp->f) jp->son[x]=r;
46         }
47     }
48     p = last;
49     while(p->f){
50         p = p->f;
51         p->sc++;
52     }
53 }
54 char str[55];
55 int solve()
56 {
57     SamNode *cur = root;
58     int len = strlen(str);
59     for(int i=0 ; i<len ; i++){
60         int v = str[i]-‘a‘;
61         if(cur->son[v]){
62             cur = cur->son[v];
63         }
64         else{
65             return 0;
66         }
67     }
68     return cur->sc;
69 }
70
71
72 int main()
73 {
74    // freopen("data_in.txt" , "r" , stdin);
75     int n , m , op;
76     while(~scanf("%d%d" , &n , &m))
77     {
78         scanf("%s" , s);
79
80         init();
81         for(int i=0 ; i<n ; i++) add(s[i]-‘a‘);
82         while(m--){
83            // cout<<m<<endl;
84             scanf("%d" , &op);
85             if(op==2){
86               //  cout<<"in"<<endl;
87                 scanf("%s" , str);
88                 printf("%d\n" , solve());
89
90             }
91             else{
92                 scanf("%s" , str);
93                 add(str[0]-‘a‘);
94             }
95         }
96     }
97     return 0;
98 }
时间: 2024-10-10 23:02:38

COJ 1287 求匹配串在模式串中出现的次数的相关文章

【基本算法】 KMP文本串模式串的字符串匹配算法

看了两个晚上的KMP,加上基本的“暴力匹配” 今晚看懂next[j]递归求解时,突然觉得算法真的好美妙,虽然觉悟的晚但晚胜过没有是吧! 我的博客都是应试性的学习笔记,不具备指导性,还是大神们写的好,例如July和matrix67的博客(今天还知道了matrix67的传奇) [置顶] 从头到尾彻底理解KMP(2014年8月22日版) [置顶]         从头到尾彻底理解KMP(2014年8月22日版) 实习辞职了,可以全心全意看书找工作了,自由真是好!!为了我们俩以后在一起!! 什么时候努力

数据结构- 串的模式匹配算法:BF和 KMP算法

Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从串s 的第二个字符起再重新和串t进行比较. 2) 依此类推,直至串t 中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功. Brute-Force算法的实现 c语言实现: [cpp] vie

【数据结构】1、串的模式匹配算法

首先我们一般求子串的位置的时候,我们可以使用这样的方法 /* *功能:这个是定长的串的顺序存储 *时间:2015年7月15日17:16:01 *文件:SString.h *作者:cutter_point */ #ifndef SSTRING_H #define SSTRING_H #define MAXSTRLEN 255 class SString { unsigned char* ch; //我们的串的顺序存储空间 unsigned int length; //我们有效元素的个数 publi

串的模式匹配算法(BF算法和KMP算法)

串的模式匹配算法 子串的定位操作通常称为串的 模式匹配,其中T称为 模式串. 一般的求子串位置的定位函数(Brute Force) 我写java的代码是这样的 int index(String S,String T,int pos){ char[] s_arr = S.toCharArray(); char[] t_arr = T.toCharArray(); int i,j,k;//i是主串S的指针,j是模式串的指针 if(pos < 0 || pos>S.length() || S.len

串、串的模式匹配算法(子串查找)BF算法、KMP算法

串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3--.an ' n = 0时为空串串的顺序存储结构:字符数组,串的长度就是数组末尾'\0'前面的字符个数数组需在定义时确定长度,有局限性数组的最大长度二:串的堆分配存储表示typedef struct { char *ch; //若是非空串,则按串长分配存储区 //否则ch为空 int length; //串长度}HS

hdu3065 病毒侵袭持续中 AC自动机入门题 N(N &lt;= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。

/** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数. 思路:ac自动机做发,val标记每一个病毒串编号,通过print函数统计每一个病毒出现的次数. AC自动机好文章:http://www.cppblog.com/menjitianya/archi

POJ 3461 Oulipo (求模式串在文本串中出现的次数)

Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 36128   Accepted: 14584 Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quot

(KMP 1.3)hdu 2087 剪花布条(求文本串中有几个模式串)

题目: 剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10380    Accepted Submission(s): 6684 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输

【暖*墟】 #AC自动机# 多模式串的匹配运用

一.构建步骤 1.将所有模式串构建成 Trie 树 2.对 Trie 上所有节点构建前缀指针(类似kmp中的next数组) 3.利用前缀指针对主串进行匹配 AC自动机关键点一:trie字典树的构建过程 字典树的构建过程是这样的,当要插入许多单词的时候,我们要从前往后遍历整个字符串, 当我们发现当前要插入的字符其节点再先前已经建成,我们直接去考虑下一个字符即可, 当我们发现当前要插入的字符没有再其前一个字符所形成的树下没有自己的节点, 我们就要创建一个新节点来表示这个字符,接下往下遍历其他的字符.