题目链接:点击查看

题目大意:给出一个匹配串 str ,再给出 n 个长度不大于 6 的匹配串 s ,问每个匹配串出现的次数,分可以重复或不可以重复两种情况

题目分析:因为是匹配串在模式串中出现的次数,可以重复的情况就是AC自动机的最简单情况了,对于不允许重复的情况,我们可以对于每个节点记录一下最后一次出现的位置,与其长度比较一下就好了,为了简化代码,我们可以给 cnt 数组,也就是记录每个节点出现次数的数组多开一维,表示是否允许重复

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=6e5+100;char s[10],str[N];int fail[N],pos[N],trie[N][26],type[N],deep[N],num[N][2],cnt;//type:操作类型 0:可重复 1:不可重复 deep:字符串长度 pos:字符串结尾节点编号int last[N];//最后一次出现的位置 int insert_word()
{int len=strlen(s);int pos=0;for(int i=0;i<len;i++){int to=s[i]-'a';if(!trie[pos][to]){trie[pos][to]=++cnt;deep[cnt]=i+1;} pos=trie[pos][to];}return pos;
}void getfail()
{queue<int>q;for(int i=0;i<26;i++){if(trie[0][i]){fail[trie[0][i]]=0;q.push(trie[0][i]);}}while(!q.empty()){int cur=q.front();q.pop();for(int i=0;i<26;i++){if(trie[cur][i]){fail[trie[cur][i]]=trie[fail[cur]][i];q.push(trie[cur][i]);}elsetrie[cur][i]=trie[fail[cur]][i];}}
}void search_word()
{int len=strlen(str),pos=0;for(int i=0;i<len;i++){int to=str[i]-'a';pos=trie[pos][to];int k=pos;while(k){num[k][0]++;if(i-last[k]>=deep[k]){num[k][1]++;last[k]=i;}k=fail[k];}}
}void init()
{cnt=0;memset(pos,0,sizeof(pos));memset(trie,0,sizeof(trie));memset(num,0,sizeof(num));memset(last,-1,sizeof(last));
}int main()
{
//#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
//#endif
//  ios::sync_with_stdio(false);int kase=0;while(scanf("%s",str)!=EOF){init();int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%s",type+i,s);pos[i]=insert_word();}getfail();search_word();printf("Case %d\n",++kase);for(int i=1;i<=n;i++)printf("%d\n",num[pos[i]][type[i]]);putchar('\n');}return 0;
}

ZOJ - 3228 Searching the String(AC自动机求不重复子串出现次数)相关推荐

  1. ZOJ 3228 Searching the String (AC自动机)

    题意: 给你一个模板串, 和n 个要匹配的串, 匹配串有两种类型, 第一种 可以在模板串中 重叠 出现, 另一种不可以重叠, 问每个串的两种形式 所出现的数量. 思路: 很明显ac自动机. 我们先把所 ...

  2. zoj-3228 Searching the String AC自动机

    用一个val数组记录每一个单词结尾对应的位置,pos数组记录某个节点的深度(其实就是记录单词的长度的),然后用一个op数组记录一下每一个单词对应的询问方式,主要是查询分为了可重叠和不可重叠,不可重叠的 ...

  3. hdu 6086 -- Rikka with String(AC自动机 + 状压DP)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  4. hdu 6086 Rikka with String(AC自动机+状压dp)

    题目链接:hdu 6086 Rikka with String 题意: 给你n个只含01的串,和一个长度L,现在让你构造出满足s[i]≠s[|s|−i+1] for all i∈[1,|s|] ,长度 ...

  5. A. chino with string(ac自动机+floyd矩阵快速幂)

    LINK 有mmm个字符串,每个字符串有一定的分值(可能为负数) 求出一个长nnn的字符串sss使得它的价值最大,你只需要输出这个最大的价值. 价值定义为∑i=1mcii∗pointi\sum\lim ...

  6. 转自kuangbin的AC自动机(赛前最后一博)

    有了KMP和Trie的基础,就可以学习神奇的AC自动机了.AC自动机其实就是在Trie树上实现KMP,可以完成多模式串的匹配.           AC自动机 其实 就是创建了一个状态的转移图,思想很 ...

  7. 字符串处理 —— AC 自动机

    [概述] KMP 算法用于解决长文本的单模板匹配问题,字典树用于解决单个单词(短文本)多模板匹配问题,而 AC 自动机用于解决的是长文本的多模板匹配问题,其是以 trie 树的结构为基础,结合 KMP ...

  8. 2018 Arab Collegiate Programming Contest (ACPC 2018) E - Exciting Menus AC自动机

    E - Exciting Menus 建个AC自动机求个fail指针就好啦. #include<bits/stdc++.h> #define LL long long #define fi ...

  9. 【LOJ6681】yww 与树上的回文串(点分治)(AC自动机)(字符串哈希)(回文串broder理论)

    传送门 社论(题解): 首先长剖重剖都考虑过了,并没有办法支持快速合并,边分更不用说了,权值在边上怎么边分怎么蛋疼. 考虑点分,我们知道如果一个回文串过了重心,他要么就是重心延伸出去的回文前缀,要么它 ...

最新文章

  1. python求平方根的代码_Python求平方根(附带源码)
  2. java 稀疏数组和二维数组转换,并保存稀疏数组到文件后可以读取
  3. c语言实现程序只执行一次,请问大家,为什么我调用我定义的函数俩次,但是程序只执行一次...
  4. 字符串基本操作 c语言,数据结构C语言字符串的基本操作.doc
  5. mysql 引擎是表级别_Mysql表引擎优化
  6. package javax.servlet.jsp.tagext does not exist的错误消息如何解决
  7. 7 Statistical estimation
  8. 回答嵌入式初学者的一些问题
  9. Struts2数据封装
  10. 最新emoji表情代码大全_如何给微信公众号菜单添加emoji(亲测有效)
  11. 条码追溯系统解决外贸企业进销存管理
  12. 关于Acad的cui(研究adobe pdf)
  13. CarSim仿真快速入门(十五)—CarSim传感器仿真之ADAS Sensor Objects (1)
  14. 微信小程序setData不起作用
  15. 【个人小程序和企业小程序的区别】
  16. java下拉框怎么做_java下拉框怎么做?
  17. ACCESS数据库防下载方法
  18. 【RNN入门到实战】LSTM从入门到实战——实现空气质量预测
  19. 【LeetCode 二分查找专项】最长递增子序列(300)(to be polished...)
  20. 实例说明图像的灰度化和二值化的区别

热门文章

  1. Ribbon-负载均衡原理
  2. SpringBoot内置Tomcat支持多大并发量和连接数
  3. 当开启了延迟加载的开关,对象是怎么变成代理对象的?
  4. 通过@Value + @PropertySource来给组件赋值
  5. OAuth2.0在项目中认证流程介绍
  6. RocketMQ错误消息重试策略之Consumer的重试机制(Exception情况)
  7. 由控制台输入年龄-不同类型不能直接比较
  8. 并发调试和JDK8新特性
  9. 迭代器模式coding
  10. Maven(1)--坐标与依赖