BZOJ2780——[Spoj]8093 Sevenk Love Oimaster
0、题意:给定N个原始字符串S,M次查询某个特殊的字符串S’在多少个原始串中出现过。
1、分析:这个题我们第一感觉就是可以用后缀自动机来搞,然后我们发现不是本质不同的字串。。求出现过的次数,也就是说多次出现只算一次。。。然后我们依旧用建立后缀自动机,然后我们观察到询问是可以离线的。。然后冷静一下QAQ……好了。。询问可以离线后,我们对这个树形结构求一下dfs序,然后我们就可以把树上的询问变成一个序列的区间查询,然后就变成了BZOJ1878HH的项链。。具体怎么搞呢?我们可以将询问排序,然后离线的扫一遍,记录一下x的颜色的上一次出现位置,然后转移就好
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
inline int read(){
char ch = getchar(); int x = 0, f = 1;
while(ch < '0' || ch > '9'){
if(ch == '-') f = -1;
ch = getchar();
}
while('0' <= ch && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
struct Edge{
int u, v, next;
} G[400010];
int head[200010], tot;
char str[500010];
int first[200010], val[200010], nxt[200010], num;
int C[200010];
int n, m;
int pre[200010];
inline void ues(int u, int v){
num ++;
val[num] = v;
nxt[num] = first[u];
first[u] = num;
}
inline void add(int x, int y){
G[++ tot] = (Edge){x, y, head[x]};
head[x] = tot;
}
map<int , int> :: iterator it;
int vis[200010];
int last, cnt, p, np, q, nq;
int len[200010], fa[200010];
map<int , int> tranc[200010];
int right[200010], c[200010], od[200010];
int tim;
int ans[200010];
inline void insert(int c, int w){
p = last;
if(tranc[p][c] != 0){
q = tranc[p][c];
if(len[q] == len[p] + 1) last = tranc[p][c];
else{
nq = ++ cnt; len[nq] = len[p] + 1;
for(it = tranc[q].begin(); it != tranc[q].end(); it ++){
tranc[nq][it -> first] = it -> second;
}
fa[nq] = fa[q];
fa[q] = nq;
while(tranc[p][c] == q){
tranc[p][c] = nq;
p = fa[p];
}
last = nq;
}
}
else{
last = np = ++ cnt;
vis[np] = 1;
len[np] = len[p] + 1;
tranc[cnt].clear();
right[np] = 1;
while(!tranc[p][c] && p) tranc[p][c] = np, p = fa[p];
if(!p) fa[np] = 1;
else{
q = tranc[p][c];
if(len[q] == len[p] + 1) fa[np] = q;
else{
nq = ++ cnt; len[nq] = len[p] + 1;
for(it = tranc[q].begin(); it != tranc[q].end(); it ++){
tranc[nq][it -> first] = it -> second;
}
fa[nq] = fa[q];
fa[q] = fa[np] = nq;
while(tranc[p][c] == q){
tranc[p][c] = nq;
p = fa[p];
}
}
}
last = np;
}
ues(last, w);
}
inline void init(){
memset(head, -1, sizeof(head));
for(int i = 1; i <= cnt; i ++){
add(fa[i], i);
}
}
inline void update(int x, int d){
if(x == 0) return;
for(; x <= cnt; x += (x & -x)){
C[x] += d;
}
}
inline int sum(int x){
int ret = 0;
for(; x > 0; x -= (x & -x)){
ret += C[x];
}
return ret;
}
inline void dfs(int x){
int t = ++ tim;
for(int i = first[x]; i; i = nxt[i]){
update(pre[val[i]], -1);
update(t, 1);
pre[val[i]] = t;
}
for(int i = head[x]; i != -1; i = G[i].next){
dfs(G[i].v);
}
ans[x] = sum(tim) - sum(t - 1);
}
int query(char *s)
{
int st = 1;
while(*s != '\0')
st = tranc[st][*s], s ++;
return st;
}
int main(){
last = cnt = 1;
n = read(); m = read();
for(int i = 1; i <= n; i ++){
last = 1;
scanf("%s", str + 1);
int L = strlen(str + 1);
for(int j = 1; j <= L; j ++){
insert(str[j], i);
}
}
init();
dfs(1);
for(int i = 1; i <= m; i ++){
scanf("%s", str);
printf("%d\n", ans[query(str)]);
}
return 0;
}
BZOJ2780——[Spoj]8093 Sevenk Love Oimaster的更多相关文章
- BZOJ2780 [Spoj]8093 Sevenk Love Oimaster 【广义后缀自动机】
题目 Oimaster and sevenk love each other. But recently,sevenk heard that a girl named ChuYuXun was dat ...
- BZOJ2780: [Spoj]8093 Sevenk Love Oimaster(广义后缀自动机,Parent树,Dfs序)
Description Oimaster and sevenk love each other. But recently,sevenk heard that a girl named ChuYuXu ...
- Bzoj2780: [Spoj]8093 Sevenk Love Oimaster
题目 传送门 Sol 就是广义\(sam\) 然后记录下每个状态属于哪些串,开\(set\)维护 \(parent\)树上启发式合并一下就好了 # include <bits/stdc++.h& ...
- 【BZOJ2780】[Spoj]8093 Sevenk Love Oimaster 广义后缀自动机
[BZOJ2780][Spoj]8093 Sevenk Love Oimaster Description Oimaster and sevenk love each other. But r ...
- 三种做法:BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster
目录 题意 思路 AC_Code1 AC_Code2 AC_Code3 参考 @(bzoj 2780: [Spoj]8093 Sevenk Love Oimaster) 题意 链接:here 有\(n ...
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )
全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries ...
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster [广义后缀自动机]
JZPGYZ - Sevenk Love Oimaster Oimaster and sevenk love each other. But recently,sevenk hea ...
- bzoj 2780 [Spoj]8093 Sevenk Love Oimaster
LINK:Sevenk Love Oimaster 询问一个模式串在多少个文本串中出现过. 考虑广义SAM 统计这种数量问题一般有三种做法. 一种 暴力bitset 这道题可能可以过? 一种 暴力跳p ...
- 【刷题】BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster
Description Oimaster and sevenk love each other. But recently,sevenk heard that a girl named ChuYuXu ...
随机推荐
- 【原】redux异步操作学习笔记
摘要: 发觉在学习react的生态链中,react+react-router+webpack+es6+fetch等等这些都基本搞懂的差不多了,可以应用到实战当中,唯独这个redux还不能,学习redu ...
- sql自带函数语句
--取数值表达式的绝对值select abs(-41) 41select abs(41) 41select abs(-41.12) 41.12select abs(41.12 ...
- .Net中使用OracleDataAdapter
本来只想简单记录一下OracleDataAdapter的批量增加和修改用法的,在园子里看到一篇比较详细的就在这分享了(Oracle Data Provider for .NET),虽然用的是 Upda ...
- Java/JavaWeb中读取资源文件
1.一般工程中使用I/O类指定文件的绝对路径读取 FileInputStream fis = new FileInputStream("src/main/resources/zsm.prop ...
- 关于软件工程结对编程作业 PairProject : Elevator Scheduler(电梯调度算法的实现与测试)的总结
1)结对编程队友 1106xxxx 张扬 1106xxxx 杨军 其中,此项目的编程实现主要由前者完成. 2)关于结对编程 结对编程的优点: 最直接的一点:在结对编程中,由于有另一个人在你身边和你配合 ...
- VS编译器从DLL导出模板类
DLL与模板 http://msdn.microsoft.com/en-us/library/twa2aw10.aspx http://www.codesynthesis.com/~boris/blo ...
- 创建menu文件
一.问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下 ...
- SPL--Serializable
Serializable[自定义序列化的接口] : 实现此接口的类将不再支持 __sleep() 和 __wakeup(). 作用: 为一些高级的序列化场景提供支持.__sleep()和__wakeu ...
- Java 8 Optional类深度解析
身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. ...
- [css]通过transform缩放邮件客户端h5页面
摘要 最近一直在折腾邮件通知的东东,大概逻辑就是如果有新邮件,向收件人的app推送一条服务号消息,并且在单击该消息的时候,需要展示邮件的详情. 技术 这里是使用Exchange EWS API来实现的 ...