JZYZOJ1369 [coci2012]覆盖字符串 AC自动机
http://172.20.6.3/Problem_Show.asp?id=1369
trie树如果不优化就这么往里面放这么多单词肯定超空间+超时,所以需要去掉无用的字符串(不属于原字符串的),但是一个一个判断时间又很长;
所以解决方案就是用一个多维vis数组胡搞判定一下,非常魔性。。。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const long long maxn=;
const int modn=;
int n,m;
char ch[maxn]={};
char ch1[]={};
int vis[maxn]={};
queue<int>q;
struct trie{
int next[];
bool exist;
int fail,d;
}e[maxn*];int tot=;
bool ff[][][][][]={};
void insert(int k,int d,int x){
if(d==k){
e[x].exist=;e[x].d=d;
return;
}
int z=ch1[d]-'a';
if(!e[x].next[z])e[x].next[z]=++tot;
insert(k,d+,e[x].next[z]);
}
void build(){
q.push();int x,y,f;
while(!q.empty()){
x=q.front();q.pop();
for(int i=;i<;i++){
y=e[x].next[i];
if(y){
if(x!=){
f=e[x].fail;
while((!e[f].next[i])&&f)f=e[f].fail;
e[y].fail=e[f].next[i];
}q.push(y);
}
}
}
}
int read(){
char chh=getchar();int k=;
while(chh<'a'||chh>'z'){chh=getchar();}
while(chh>='a'&&chh<='z'){ch1[k++]=chh;chh=getchar();}
return k;
}
void read1(){
char chh=getchar();int k=;
while(chh<'a'||chh>'z'){chh=getchar();}
while(chh>='a'&&chh<='z'){ch[k++]=chh;chh=getchar();}
}
int main(){
//freopen("wtf.in","r",stdin);
//freopen("wtf.out","w",stdout);
scanf("%d",&n);read1();
for(int i=;i<n;i++){
ff[(int)ch[i-]-'a'][(int)ch[i-]-'a'][(int)ch[i-]-'a'][(int)ch[i-]-'a'][(int)ch[i]-'a']=;
}
scanf("%d",&m);
for(int i=;i<=m;i++){
int siz=read(),wtf=;
for(int j=;j<siz;j++){
if(!ff[(int)ch1[j-]-'a'][(int)ch1[j-]-'a'][(int)ch1[j-]-'a'][(int)ch1[j-]-'a'][(int)ch1[j]-'a'])
wtf=;
}if(wtf)insert(siz,,);
}build();
int x=,y;
for(int i=;i<n;i++){
int z=ch[i]-'a';
while((!e[x].next[z])&&x){
x=e[x].fail;
}
x=e[x].next[z];y=x;
while((!e[y].exist)&&y){
y=e[y].fail;
}vis[i-e[y].d+]=max(vis[i-e[y].d+],e[y].d);
}
int k=;int t=;
for(int i=;i<n;i++){
k=max(vis[i],k);
if(k>)t++;
k--;
}
printf("%d\n",n-t);
return ;
}
JZYZOJ1369 [coci2012]覆盖字符串 AC自动机的更多相关文章
- [coci2012]覆盖字符串 AC自动机
给出一个长度为N的小写字母串,现在Mirko有M个若干长度为Li字符串.现在Mirko要用这M个字符串去覆盖给出的那个字符串的.覆盖时,必须保证:1.Mirko的字符串不能拆开,旋转:2.Mirko的 ...
- 模板—字符串—AC自动机(多模式串,单文本串)
模板—字符串—AC自动机(多模式串,单文本串) Code: #include <queue> #include <cstdio> #include <cstring> ...
- 【bzoj1030】: [JSOI2007]文本生成器 字符串-AC自动机-DP
[bzoj1030]: [JSOI2007]文本生成器 首先把匹配任意一个的个数的问题转化为总个数-没有一个匹配的个数 先构造AC自动机,然后枚举每一位的字母以及在自动机上的位置 f[i][j]为第i ...
- 【bzoj3172】: [Tjoi2013]单词 字符串-AC自动机
[bzoj3172]: [Tjoi2013]单词 先用所有单词构造一个AC自动机 题目要求的是每个单词在这个AC自动机里匹配到的次数 每次insert一个单词的时候把路径上的cnt++ 那么点p-&g ...
- 字符串——AC自动机
目录 一.前言 二.思路 三.代码 四.参考资料 一.前言 以前一直没学AC自动机,主要是被名字吓到了,自动AC,这么强的名字肯定很难,学了后才发现,其实不难. AC自动机并不是Acept autom ...
- 【bzoj2434】: [Noi2011]阿狸的打字机 字符串-AC自动机-BIT
[bzoj2434]: [Noi2011]阿狸的打字机 x串在y串上的匹配次数就是y在自动机所有节点上能够通过fail走到x最后一个节点的个数 (就是y串任意一个前缀的后缀能匹配到x的个数)和[bzo ...
- bzoj 3172 单词 ac自动机|后缀数组
题目大意: 给定n个字符串连成了一篇文章,问每个字符串在这篇文章中出现的次数,可重复覆盖 这里ac自动机和后缀数组都可以做 当然后缀数组很容易就解决,但是相对时间消耗高 这里就只讲ac自动机了 将每个 ...
- AC自动机相关Fail树和Trie图相关基础知识
装载自55242字符串AC自动机专栏 fail树 定义 把所有fail指针逆向,这样就得到了一棵树 (因为每个节点的出度都为1,所以逆向后每个节点入度为1,所以得到的是一棵树) 还账- 有了这个东西, ...
- 「kuangbin带你飞」专题十七 AC自动机
layout: post title: 「kuangbin带你飞」专题十七 AC自动机 author: "luowentaoaa" catalog: true tags: - ku ...
随机推荐
- 【51NOD-0】1046 A^B Mod C
[算法]快速幂运算 [题解]快速幂的原理是把幂用二进制表示,从最低位a,次低位a2,次次低位(a2)2. #include<cstdio> long long quick_pow(long ...
- html meta标签作用
1.概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他web服务. 必要属性: conten ...
- 【swupdate文档 一】嵌入式系统的软件管理
嵌入式系统的软件管理 嵌入式系统变得越来越复杂, 它们的软件也反映了这种复杂性的增加. 为了支持新的特性和修复,很有必要让嵌入式系统上的软件 能够以绝对可靠的方式更新. 在基于linux的系统上,我们 ...
- (十七)vmware无法将网络更改为桥接状态
故障现象,导致虚拟机无法正常上网 设备管理器中的驱动设备正常加载,但是注意这两个虚拟网卡是有问题的 将这两个虚拟网卡删除 只剩物理网卡了,重新启动电脑 将虚拟机里的网络设置删除 清空网卡后点击恢复默认 ...
- C#多线程编程之:集合类中Synchronized方法与SyncRoot属性原理分析
我们知道,在.net的一些集合类型中,譬如Hashtable和ArrayList,都有Synchronized静态方法和SyncRoot属性,他们之间有联系吗?我怎么才能用好他们呢? 以Hashtab ...
- centos安装VNC的方法
https://help.aliyun.com/knowledge_detail/6698160.html(阿里云官方文档,但是官方文档有些地方是错的,我更正了下) ----------------- ...
- request.getRemoteAddr() 获取的值为0:0:0:0:0:0:0:1的原因及解决办法
问题: 在近期开发的javaweb项目中,需要记录登录时的电脑ip地址和主机名,通过request.getRemoteAddr()和request.getRemoteHost()得到的值都是0:0:0 ...
- google code-prettify 代码高亮插件使用方法
找代码高亮插件选了好久,还是这个使用起来比较方便. 先上链接:插件下载地址 官方使用方法地址 建议看官方的资料,我这里仅仅简要描述一下使用方法: 引入方法: 测试引入是否成功:herf 换成 自己放置 ...
- 【转载】WebService到底是什么?
http://blog.csdn.net/wooshn/article/details/8069087/ 一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍 ...
- 四十一 常用内建模块 datetime
datetime是Python处理日期和时间的标准库. 获取当前日期和时间 我们先看如何获取当前日期和时间: >>> from datetime import datetime &g ...