http://www.lydsy.com/JudgeOnline/problem.php?id=2780 (题目链接)

题意

  给出很多主串和很多询问串,求一个询问串在多少主串中出现过

Solution

  我们先构造出后缀自动机,然后把主串在后缀自动机上匹配,能够到达哪个状态就把那个状态的计数器${cnts++}$,表示可以匹配到一个主串,同时,这个状态的后缀也可以被这个主串匹配到,所以我们还要跳${parent}$去更新它的祖先。有可能祖先会被重复计算,所以还要打个标记。。

  最后询问串就在后缀自动机上跑匹配输出最终到达状态的计数器就好了。

细节

  主串string存。

代码

// bzoj2780
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<ctime>
#define LL long long
#define inf (1ll<<30)
#define MOD 1000000007
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=100010,maxl=360010;
int par[maxn<<1],len[maxn<<1],cnts[maxn<<1],ch[maxn<<1][50];
int n,m,sz,Dargen,ww[maxn],id[maxn<<1],vis[maxn<<1];
char s[maxl];
string ss[maxn]; int Extend(int c,int p) {
int np=++sz;
len[np]=len[p]+1;
for (;p && !ch[p][c];p=par[p]) ch[p][c]=np;
if (!p) par[np]=Dargen;
else {
int q=ch[p][c];
if (len[q]==len[p]+1) par[np]=q;
else {
int nq=++sz;len[nq]=len[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
par[nq]=par[q];
par[np]=par[q]=nq;
for (;p && ch[p][c]==q;p=par[p]) ch[p][c]=nq;
}
}
return np;
}
int match() {
int l=strlen(s+1),p=1;
for (int i=1;i<=l;i++) {
if (!ch[p][s[i]-'a']) return 0;
p=ch[p][s[i]-'a'];
}
return cnts[p];
}
int main() {
scanf("%d%d",&n,&m);
Dargen=sz=1;
for (int i=1;i<=n;i++) {
scanf("%s",s);
ss[i]=(string)s;
int l=ss[i].length(),p=1;
for (int i=0;i<l;i++) p=Extend(s[i]-'a',p);
}
for (int i=1;i<=n;i++) {
int l=ss[i].length(),p=1;
for (int j=0;j<l;j++) {
p=ch[p][ss[i][j]-'a'];
for (int k=p;k && vis[k]!=i;k=par[k]) cnts[k]++,vis[k]=i;
}
}
for (int i=1;i<=m;i++) {
scanf("%s",s+1);
printf("%d\n",match());
}
return 0;
}

【bzoj2780】 Sevenk Love Oimaster的更多相关文章

  1. 【BZOJ2780】Sevenk Love Oimaster【广义后缀自动机】

    题意 给出你n个字符串和q个查询,每个查询给出一个字符串s,对于每个查询你都要输出这个字符串s在上面多少个字符串中出现过. 分析 广义后缀自动机的裸题.建好SAM以后再跑一遍得到每个状态的ocu和la ...

  2. 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(后缀自动机)

    [BZOJ2780][SPOJ]Sevenk Love Oimaster(后缀自动机) 题面 BZOJ 洛谷 题解 裸的广义后缀自动机??? 建立广义后缀自动机建立出来之后算一下每个节点被几个串给包括 ...

  3. 【BZOJ2780】[Spoj]8093 Sevenk Love Oimaster 广义后缀自动机

    [BZOJ2780][Spoj]8093 Sevenk Love Oimaster Description Oimaster and sevenk love each other.     But r ...

  4. 【SPOJ 8093】Sevenk Love Oimaster

    http://www.spoj.com/problems/JZPGYZ/ 查询一个询问串在上面n个串中多少个串的子串. 后缀数组+主席树,常熟有点大... 建出广义SAM,利用parent树的dfs序 ...

  5. BZOJ2780:[SPOJ8093]Sevenk Love Oimaster(广义SAM)

    Description Oimaster and sevenk love each other. But recently,sevenk heard that a girl named ChuYuXu ...

  6. [BZOJ2780][SPOJ8093]Sevenk Love Oimaster

    bzoj luogu 题面 给定n个模板串,以及m个查询串. 依次查询每一个查询串是多少个模板串的子串. sol 广义后缀自动机裸题? 先建出\(SAM\),然后记录一下每个节点分别在多少个模板串里出 ...

  7. 【算法】后缀自动机(SAM) 例题

    算法介绍见:http://www.cnblogs.com/Sakits/p/8232402.html 广义SAM资料:https://www.cnblogs.com/phile/p/4511571.h ...

  8. [bzoj2780][Spoj8093]Sevenk Love Oimaster_广义后缀自动机

    Sevenk Love Oimaster bzoj-2780 Spoj-8093 题目大意:给定$n$个大串和$m$次询问,每次给出一个字符串$s$询问在多少个大串中出现过. 注释:$1\le n\l ...

  9. 三种做法:BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster

    目录 题意 思路 AC_Code1 AC_Code2 AC_Code3 参考 @(bzoj 2780: [Spoj]8093 Sevenk Love Oimaster) 题意 链接:here 有\(n ...

随机推荐

  1. 32bit GM命令

    GM 命令[32位服务端GM命令] //announce message this basicly tells a announcement on the whole server.. you can ...

  2. gcc 与 g++的区分较

    一:gcc与g++比较 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为 ...

  3. Navicat新建查询,系统找不到指定路径 独家解决办法

    Navicat新建查询系统找不到指定路径,很多人用了网上流行的那些解决办法,还是无法解决.比如: https://jingyan.baidu.com/article/86112f1387a713273 ...

  4. [leetcode-897-Increasing Order Search Tree]

    Given a tree, rearrange the tree in in-order so that the leftmost node in the tree is now the root o ...

  5. ClickOnce 创建桌面快捷方式

    static void Main() { bool bCreatedNew; Mutex m = new Mutex(false, "TestClickOnceClientName" ...

  6. No.1010_第七次团队会议

    渺茫的前景 今天大家都很失望,一来昨天的问题还是继续存在着,仍然没有完成.二来,我们看了一下其余几个组的界面,对自己有些难过. 我们组确实存在人手少的问题,这几天我还因为挑战杯的事情缺席了两天,感觉内 ...

  7. 安卓端通过http对Mysql进行增删改查

    各类it学习视频,大家都可以看看哦!我自己本人都是通过这些来学习it只知识的! 下面是视频链接转自:http://www.cnblogs.com/yzxk/p/4749440.html Android ...

  8. <构建之法>阅读感想

    在阅读<构建之法>之前,我所认为的软件就是通过c,c++等语言编程,制作出的一个能满足人们操作需求的一些代码,认为一个好的软件工程师,就是能够在很短的时间之内,最快的根据需求写出几段代码程 ...

  9. Linux上多次restore Tensorflow模型报错

    环境:python3,tensotflow 在恢复了预先训练好的模型进行预测时,第一次是能够成功执行的,但我多次restore模型时,出现了以下问题: 1.ValueError: Variable c ...

  10. iOS日期的加减

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateCo ...