zoj 3228 覆盖及非覆盖串的多次匹配
题目题意:
给定多个小串,在一个长串中寻找这些串的匹配次数,有些统计的是可覆盖的,有些统计的是非覆盖的
先可以简单理解一下,建立ac自动机后,当前节点包含的字符串必然被把它作为fail指针的节点包含,所以一开始写了个set[MAX],然后MLE了
如果一个当前串被完全访问了,那么这个串一定是在整个fail指针的最后面的,所以那个节点在访问中一直沿着fail指针往下走一定是能走到的,在记录一个
上一次访问的位置,就能判断当前位置是否重复覆盖了
然后根据初始记录的字符串对应的节点位置,输出在那个节点的访问次数就行了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <set>
using namespace std;
#define clr(x) memset(x , 0 , sizeof(x))
#define CHAR_SIZE 26
#define MAX_SIZE 600010
#define N 100005
char str[MAX_SIZE];
char s[];
int n , cnt[MAX_SIZE][];
int pos[N] , flag[N];
struct AC_Machine{
int sz , ch[MAX_SIZE][CHAR_SIZE] , fail[MAX_SIZE] , deep[MAX_SIZE] , val[MAX_SIZE] , pre[MAX_SIZE];
void init(){
sz = ;
clr(ch[]) , clr(val);
pre[] = ;
cnt[][] = cnt[][] = ;
} void insert(char *s , int p){
int n = strlen(s) , u=;
for(int i= ; i<n ; i++){
int c = s[i]-'a';
if(!ch[u][c]){
clr(ch[sz]);
cnt[sz][] = cnt[sz][] = pre[sz] = val[sz] = ;
ch[u][c] = sz++;
}
u = ch[u][c];
deep[u] = i+;
}
val[u] = ;
pos[p] = u;
} void get_fail(){
queue<int> Q;
fail[] = ;
for(int c= ; c<CHAR_SIZE ; c++){
int u = ch[][c];
if(u) {Q.push(u);fail[u]=;}
}
while(!Q.empty()){
int r = Q.front();
val[r] |= val[fail[r]];
Q.pop();
for(int c= ; c<CHAR_SIZE ; c++){
int u = ch[r][c];
if(!u){ch[r][c]=ch[fail[r]][c] ; continue;}
fail[u] = ch[fail[r]][c];
Q.push(u);
}
}
}
}ac; void solve()
{
int cur = , n=strlen(str);
for(int i= ; i<=n ; i++){
int c = str[i-]-'a';
cur = ac.ch[cur][c];
int v = cur;
while(v && ac.val[v]){
cnt[v][]++;
// cout<<str[i-1]<<" "<<v<<endl;
if(i-ac.pre[v]>=ac.deep[v]){
cnt[v][]++;
ac.pre[v] = i;
}
v = ac.fail[v];
}
}
} int main()
{
// freopen("in.txt" , "r" , stdin);
int cas = ;
while(~scanf("%s" , str))
{
printf("Case %d\n" , ++cas);
scanf("%d" , &n);
int op;
ac.init();
for(int i= ; i<=n ; i++){
scanf("%d%s" , &op , s);
flag[i] = op;
ac.insert(s , i);
}
ac.get_fail();
solve(); for(int i= ; i<=n ; i++){
printf("%d\n" , cnt[pos[i]][flag[i]]);
}
puts("");
}
return ;
}
zoj 3228 覆盖及非覆盖串的多次匹配的更多相关文章
- nginx添加模块 (非覆盖安装)
nginx添加模块(非覆盖安装) 原已经安装好的nginx,现在需要添加一个未被编译安装的模块: 查看原来编译时都带了哪些参数# /usr/local/nginx/sbin/nginx -V ngin ...
- zoj3228 Searching the String AC自动机查询目标串中模式串出现次数(分可覆盖,不可覆盖两种情况)
/** 题目:zoj3228 Searching the String 链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=34 ...
- python 面向对象专题(九):特殊方法 (二)__get__、__set__、__delete__ 描述符(二)覆盖型与非覆盖型描述符对比
前言 根据是否定义__set__ 方法,描述符可分为两大类. 实现 __set__ 方法的描述符属于覆盖型描述符,因为虽然描述符是类属性,但是实现 __set__ 方法的话,会覆盖对实例属性的赋值操作 ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
- DLX 舞蹈链 精确覆盖 与 重复覆盖
精确覆盖问题:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 还有重复覆盖问题 dancing links 是 一种数据结构,用来优化搜索,不算是一种算法.(双向 ...
- ZOJ 3228 Searching the String(AC自动机)
Searching the String Time Limit: 7 Seconds Memory Limit: 129872 KB Little jay really hates to d ...
- codevs 1214 线段覆盖/1643 线段覆盖 3
1214 线段覆盖/1214 线段覆盖 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定x轴上的N(0< ...
- C# DllImport“调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配 ”
调用外部dll时,出现如下问题 C# DllImport“调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配.请检查 PInvoke 签名的调用约定和参数与非托管的目标 ...
- hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...
随机推荐
- 使用kaptcha生成验证码
原文:http://www.cnblogs.com/xdp-gacl/p/4221848.html kaptcha是一个简单好用的验证码生成工具,通过配置,可以自己定义验证码大小.颜色.显示的字符等等 ...
- Android控件之Button(按钮控件)和ImageButton(图片按钮控件)
一.Button和ImageButton特证: 1.共同特证: 都可以作为一个按钮产生点击事件 2.不同特证: Button有text的属性,ImageButton没有 ImageButton有src ...
- jquery中html(), text(),val()区别(zhuan)
https://zhidao.baidu.com/question/307317838.html http://www.cnblogs.com/aqbyygyyga/archive/2011/11/0 ...
- Sqlserver_时间用法
函数 描述 GETDATE() 返回当前的日期和时间 DATEPART() 返回日期/时间的单独部分 DATEADD() 在日期中添加或减去指定的时间间隔 DATEDIFF() 返回两个日期之间的时间 ...
- mac10.12的Cocopods安装使用
Cocopods的安装 CocoaPods应该是iOS最常用最有名的类库管理当我们开发iOS应用时,会经常使用到很多第三方开源类库,比如AFNetWorking等等,可能某个类库又用到其他的库,手动一 ...
- listToString
http://www.oschina.net/code/snippet_109648_2229
- (转)HashMap分析
原文地址:http://www.cnblogs.com/ITtangtang/p/3948406.html HashMap的数据结构 HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快 ...
- GATK原理及流程
用GATK跑了很久的流程,但还是不知道它的原理,现在项目要深入,没有流程可用,一切都要手动,所以必须开始着手了解GATK运行的原理,必须要知道需要输入什么,基本的算法,输出是什么. 参见: GATK使 ...
- iconv 文件编码相互转换
iconv 文件编码相互转换 示例: iconv -f utf-8 -t gbk ~/a.txt > ~/b.txt -f 从哪种格式转换 -t 要转换到哪种格式 a.txt要转换的文件 b.t ...
- robotframework笔记15
资源和变量文件 用户关键字和变量 测试用例文件 和 测试套件 初始化文件只能用于文件在哪里 了,但 资源文件 提供一种机制来分享它们. 自 资源文件结构非常接近测试用例文件,它是 容易创建它们. 变量 ...