CF710F String Set Queries

支持字符串的插入和删除。。。SAM也干不了这个事

所以可以用cdq分治+AC自动机O(nlogn)解决

但是本题强制在线~~~

我们还有一个工具,叫做二进制分组!

所以,每组建立一个AC自动机,合并的时候,AC自动机合并。最后再build失配指针

随机删除?虽然不是栈序删除了,但是,统计数量具有贡献独立性,再对删除串建立一个AC自动机集群即可!

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=3e5+;
int m;
int ch[N][];
int vis[N][];
int fail[N],num[N],tot[N];
int rt[N],sz[N];
int cnt,totid;
struct AC{
int sta[N],top;
int merge(int x,int y){
// cout<<"merge "<<x<<" "<<y<<endl;
if(!x||!y) return x+y;
for(reg i=;i<;++i) ch[x][i]=merge(ch[x][i],ch[y][i]);
num[x]+=num[y];
return x;
}
void build(int id){
queue<int>q;
for(reg i=;i<;++i){
if(ch[rt[id]][i]) fail[vis[rt[id]][i]=ch[rt[id]][i]]=rt[id],q.push(vis[rt[id]][i]);
else vis[rt[id]][i]=rt[id];
}
while(!q.empty()){
int x=q.front();q.pop();
tot[x]=num[x]+tot[fail[x]];
for(reg i=;i<;++i){
if(ch[x][i]){
fail[vis[x][i]=ch[x][i]]=vis[fail[x]][i];
q.push(vis[x][i]);
}else{
vis[x][i]=vis[fail[x]][i];
}
}
}
}
int query(char *s){
int len=strlen(s+);
int ret=;
for(reg i=;i<=top;++i){
int id=sta[i];
int now=rt[id];
for(reg i=;i<=len;++i){
now=vis[now][s[i]-'a'];
ret+=tot[now];
}
}
return ret;
}
void ins(char *s){
int id=++totid;
int len=strlen(s+);
if(!rt[id]) rt[id]=++cnt;
int now=rt[id];
for(reg i=;i<=len;++i){
int x=s[i]-'a';
ch[now][x]=++cnt;
now=ch[now][x];
}
++num[now];
//dfs(rt[id]);
// cout<<rt[id]<<" "<<cnt<<endl;
sz[id]=;
// cout<<" after ins "<<id<<endl;
while(top&&sz[sta[top]]==sz[id]) rt[id]=merge(rt[id],rt[sta[top]]),sz[id]+=sz[sta[top]],--top;
// cout<<" after merge "<<endl;
build(id);
sta[++top]=id; }
}f,d;
char s[N];
int main(){
rd(m);
int op;
for(reg i=;i<=m;++i){
rd(op);scanf("%s",s+);
if(op==)f.ins(s);
else if(op==)d.ins(s);
else {
printf("%d\n",f.query(s)-d.query(s));
}
fflush(stdout);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/24 15:19:38
*/

二进制分组,对于许多插入删除根本不虚,反正暴力重构删除,O(nlogn)

(当然如果贡献不独立,还是cdq或者线段树分治吧,,)

CF710F String Set Queries的更多相关文章

  1. 【CF710F】String Set Queries(二进制分组,AC自动机)

    [CF710F]String Set Queries(二进制分组,AC自动机) 题面 洛谷 CF 翻译: 你有一个字符集合\(D\),初始为空, 有三种操作: 往\(D\)中加入一个串:从\(D\)中 ...

  2. 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组

    F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...

  3. CodeForces - 710F:String Set Queries (二进制分组 处理 在线AC自动机)

    ou should process m queries over a set D of strings. Each query is one of three kinds: Add a string ...

  4. Codeforces 710F - String Set Queries(AC 自动机)

    题面传送门 题意:强制在线的 AC 自动机. \(n,\sum|s|\leq 3\times 10^5\) 如果不是强制在线那此题就是道 sb 题,加了强制在线就不那么 sb 了. 这里介绍两种做法: ...

  5. 【CF 710F】String Set Queries

    在校内OJ上A了,没有加强制在线的东西..不放链接了. 这道题题意是维护一个字符串集合,支持三种操作: 1.加字符串 2.删字符串 3.查询集合中的所有字符串在给出的模板串中出现的次数 操作数\(m ...

  6. 题解-Codeforces710F String Set Queries

    咕了好久没更博客,最近得知可以去冬眠营玩耍,还可以搭顺风车回广州过年 (最近做到的比较有意思的题目:bzoj3958.hihocoder1419) Problem Codeforces-710F--洛 ...

  7. 【Codeforces 710F】String Set Queries

    Codeforces 710 F 思路:KMP学的还是不过关啊... 按照字符串的长度分类,如果长度大于\(\sqrt{n}\)的就扔到什么地方等待查询,否则就扔进trie里面. 对于查询,我们先在t ...

  8. Java JDBC批处理插入数据操作

    在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...

  9. 399. Evaluate Division

    图像题,没觉得有什么简单的办法,貌似可以用Union Find来解. 感觉有2种思路,一种是先全部构建好每2个点的weight,然后直接遍历queires[][]来抓取答案. 一种是只构建简单的关系图 ...

随机推荐

  1. 【调试技巧】 Fiddler高级用法之url映射请求

    问题场景: 已发布线上APP出现接口错误,如何测试线上APP访问本地请求? 已发布线上H5页面,静态资源或js调试,如何映射本地js? 一般解决方案: 猜测(一般明显问题). 找到原发布包,修改请求资 ...

  2. [UWP 自定义控件]了解模板化控件(2):模仿ContentControl

    ContentControl是最简单的TemplatedControl,而且它在UWP出场频率很高.ContentControl和Panel是VisualTree的基础,可以说几乎所有VisualTr ...

  3. Mysql优化系列(1)--Innodb重要参数优化

    1.简单介绍InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎.InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读.这些特色 ...

  4. Centos下内网DNS主从环境部署记录

    一.DNS是什么?DNS(Domain Name System),即域名系统.它使用层次结构的命名系统,将域名和IP地址相互映射,形成一个分布式数据库系统. DNS采用C-S架构,服务器端工作在UDP ...

  5. 【Beta阶段】第六次Scrum Meeting!

    每日任务内容: 本次会议为第六次Scrum Meeting会议~ 由于本次会议项目经理召开时间为9:30,在公寓1楼会客室召开,召开时长约30分钟,探讨了本次取得的重大突破后需要继续开展的工作. 队员 ...

  6. Linux内核读书笔记第五周链接

    1.临界区(critical regions)就是访问和操作共享数据的代码段.多个执行线程并发访问同一个资源通常是不安全的,为了避免在临界区中并发访问,编程者必须保证这些代码 原子地执行.也就是说,代 ...

  7. 博客用Markdown编辑器插入视频

    要展示一些App的效果用或者更方便地展示工具的操作,可以使用视频. 以下有两种方式可以在博客中插入视频 第一种 此方法适用于插入来源优酷的视频或者你自己录制了视频上传到优酷,这种方法的好处是可以插入时 ...

  8. Maven的课堂笔记4

    9.Maven与MyEclipse2014结合 MyEclipse10以上的版本,对Maven支持的就比较好 9.2 Myeclipse配置 本地文件夹的C盘的.m2文件夹下必须得有这个setting ...

  9. springframework内BeanUtils源码使用记录一

    package org.springframework.beans; public abstract class BeanUtils /** * Copy the property values of ...

  10. Spring 入门知识点笔记整理

    一.Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Sprin ...