后缀自动机版本:

所有的串用(char)('z'+1)连起来,然后建自动机。再用原串在自动机上跑。跑到的位置的endpos就是出现的次数。不过内存有点大。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,SSZ=*SZ,APB=,one=,INF=0x7FFFFFFF,mod=;
int n,len,cnt,slink[SSZ],nex[SSZ][APB],maxlen[SSZ];
int minlen[SSZ],endpos[SSZ],in[SSZ];
char ch[SZ];
string str[SZ];
bool green[SSZ]; void add(string &x)
{
for(int i=;i<x.size();++i)
{
ch[++len]=x[i];
}
ch[++len]='z'+;
} int ins(int pre,int c)
{
int z=++cnt,u=pre;
green[z]=;
for(;u!=-&&!nex[u][c];u=slink[u])nex[u][c]=z;
maxlen[z]=maxlen[pre]+;
if(u==-)
{
slink[z]=;
}
else
{
int x=nex[u][c];
if(maxlen[x]==maxlen[u]+)
{
slink[z]=x;
}
else
{
int v=++cnt;
memcpy(nex[v],nex[x],sizeof(nex[x]));
maxlen[v]=maxlen[u]+;
slink[v]=slink[x];
minlen[v]=maxlen[slink[v]]+;
slink[x]=slink[z]=v;
minlen[x]=maxlen[v]+;
for(;u!=-&&nex[u][c]==x;u=slink[u])
nex[u][c]=v;
}
}
minlen[z]=maxlen[slink[z]]+;
return z;
} void topo()
{
for(int i=;i<=cnt;++i)
{
++in[slink[i]];
}
stack<int> stk;
for(int i=;i<=cnt;++i)
{
if(!in[i])stk.push(i),endpos[i]=;
}
for(;stk.size();)
{
int top=stk.top();
stk.pop();
int pre=slink[top];
endpos[pre]+=endpos[top],--in[pre];
if(!in[pre]&&pre)
{
if(green[pre])++endpos[pre];
stk.push(pre);
}
}
} void init()
{
cin>>n;
for(int i=;i<=n;++i)
{
cin>>str[i];
add(str[i]);
}
int pre=;
slink[]=-;
for(int i=;i<=len;++i)
{
pre=ins(pre,ch[i]-'a');
}
topo();
} int calc(string &x)
{
int cur=;
for(int i=;i<x.size();++i)
{
int c=x[i]-'a';
cur=nex[cur][c];
}
return endpos[cur];
} void work()
{
for(int i=;i<=n;++i)
{
cout<<calc(str[i])<<endl;
}
} int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
int casenum;
//cin>>casenum;
//cout<<casenum<<endl;
//for(int time=1;time<=casenum;++time)
//for(int time=1;cin>>n>>qnum,n;++time)
{
//cout<<"Case "<<time<<": ";
init();
work();
}
return ;
}

p3966单词的更多相关文章

  1. 洛谷 - P3966 - 单词 - AC自动机

    https://www.luogu.org/problemnew/show/P3966 因为文本串就是字典本身,所以这个和平时的AC自动机不太一样.平时的query要沿着fail树把子树的出现次数依次 ...

  2. 洛谷P3966 单词 [TJOI2013] AC自动机

    正解:AC自动机 解题报告: 传送门! 先来提供一个40pts错解QAQ 首先看到这题就会想到AC自动机板子题2鸭!然后就照着那题的套路打一下,随便改一点儿,简单来说就是每次经过一个节点都要++,然后 ...

  3. P3966 [TJOI2013]单词

    P3966 [TJOI2013]单词 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出 ...

  4. 洛谷P3966 [TJOI2013]单词(fail树性质)

    P3966 [TJOI2013]单词 题目链接:https://www.luogu.org/problemnew/show/P3966 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单 ...

  5. 洛谷P3966 [TJOI2013]单词(AC自动机)

    题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ...

  6. 洛谷P3966 [TJOI2013]单词(后缀自动机)

    传送门 统计单词出现次数……为啥大家都是写AC自动机的嘞……明明后缀自动机也能做的说…… 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ...

  7. 【洛谷 P3966】 [TJOI2013]单词(AC自动机,差分)

    把单词连起来,中间插入间隔符,同 #include <cstdio> #include <queue> #include <cstring> using names ...

  8. Luogu P3966 [TJOI2013]单词

    题目链接 \(Click\) \(Here\) 本题\(AC\)自动机写法的正解之一是\(Fail\)树上跑\(DP\). \(AC\)自动机是\(Trie\)树和\(Fail\)树共存的结构,前者可 ...

  9. [洛谷P3966][TJOI2013]单词

    题目大意:有$n$个字符串,求每个字符串在所有字符串中出现的次数 题解:$AC$自动机,每个节点被经过时$sz$加一,每一个字符串出现次数为其$fail$树子树$sz$和 卡点:$AC$自动机根节点为 ...

随机推荐

  1. Unity 特写镜头

    using UnityEngine; public class Camera_Feature : MonoBehaviour { public static Camera_Feature instan ...

  2. MongoDB在Windows系统下的安装和启动

    版本选择MongoDB的版本命名规范如:x.y.z: y为奇数时表示当前版本为开发版,如:2.3.0.2.1.1: y为偶数时表示当前版本为稳定版,如:2.0.1.2.2.0: 目前官网上最新的版本为 ...

  3. oracle删除数据库

    1.确认当前数据库是否为要删除的那一个select name from v$database; 2.关闭数据库shutdown immediate; 3.以restrict方式重新打开数据库,并启动到 ...

  4. P1342 请柬

    最近一直在做最短路......所以今天就再做一道最短路吧.... 题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片 ...

  5. 【JavaScript】for循环小练习

    1.输出1-100的和 var sum = 0; for(var i=1;i<=100;i++){ sum = sum + i; } document.write(sum); 2.输出1-100 ...

  6. SpringBoot+Thymeleaf问题

    springboot在controller返回数据到thymeleaf报404 用springboot做一个例子,访问controller可以返回数据,但是到thymeleaf却报404, 检查发现路 ...

  7. node离线版安装

    1.下载 下载地址:https://nodejs.org/zh-cn/download/ 选择相应的版本下载 2.解压缩 将文件解压到要安装的位置,并新建两个目录 node-global :npm全局 ...

  8. 第一章 Python程序语言简介

    第一节 Python概述 1. 什么是Python Python是一种 解释型.面向对象.动态数据类型 的高级程序设计语言.由Guido van Rossum与1989年发明,第一个公开发行版本发行于 ...

  9. 【题解】Luogu P5313 僕たちはひとつの光([Ynoi2012]D2T2)

    原题传送门 lovelive好评 比赛时只拿到了60pts,还是自己太菜了 这题的思想实际有点像Luogu P3674 小清新人渣的本愿与Luogu P5071 [Ynoi2015]此时此刻的光辉 这 ...

  10. [译]RabbitMQ教程C#版 - 远程过程调用(RPC)

    先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...