3172: [Tjoi2013]单词

Time Limit: 10 Sec  Memory Limit: 512 MB

Description

某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。

Input

第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,N<=200,单词长度不超过10^6

Output

输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次。

Sample Input

3
a
aa
aaa

Sample Output

6
3
1
 
题解:
这道题相对来说比较简单……
我们可以建好AC自动机,然后像后缀数组一样,把每一个串用‘&’连起来。
像这样:“aaa&aa&a”
然后拿这个大串去AC自动机里面统计次数就好了。
代码见下:
 #include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int L=;
char text[*L],s[][L];
int n,p=-,hd=,tl;
long long ans[];
struct node
{
vector<int>val;node *last,*f,*ch[];
node(){memset(ch,,sizeof(ch));val.clear();}
void* operator new(size_t);
}*root=new node(),*c,*num,*q[L*];
void* node::operator new(size_t)
{
if(c==num)
{
c=new node::node[<<];
memset(c,,sizeof(node)*(<<));
num=c+(<<);
}
return c++;
}
inline void count(node* pos)
{
while(pos)
{
for(int i=;i<pos->val.size();i++)
ans[pos->val[i]]++;
pos=pos->last;
}
}
inline void get_fail()
{
root->f=NULL;root->last=NULL;q[++tl]=root;
while(hd<=tl)
{
node *rt=q[hd++];
for(int i=;i<;i++)
{
if(rt->ch[i])
{
q[++tl]=rt->ch[i];
node *u=rt->f;
while(u&&!u->ch[i])u=u->f;
rt->ch[i]->f=(u)?u->ch[i]:root;
rt->ch[i]->last=rt->ch[i]->f->val.empty()?rt->ch[i]->f->last:rt->ch[i]->f;
}
}
}
}
inline void match()
{
node *rt=root;
for(int i=;i<p;i++)
{
if(text[i]=='&')rt=root;
else
{
int d=text[i]-'a';
while(rt&&!rt->ch[d])rt=rt->f;
rt=rt?rt->ch[d]:root;
count(rt);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",s[i]);int m=strlen(s[i]);
node* rt=root;
for(int j=;j<m;j++)
{
text[++p]=s[i][j];
if(!rt->ch[s[i][j]-'a'])
rt->ch[s[i][j]-'a']=new node();
rt=rt->ch[s[i][j]-'a'];
}
rt->val.push_back(i);text[++p]='&';
}
get_fail();match();
for(int i=;i<=n;i++)printf("%lld\n",ans[i]);
}

BZOJ3172

[BZOJ3172]单词的更多相关文章

  1. BZOJ3172 单词 Fail树

    题目大意:求一篇论文中每个单词分别在论文中出现多少次. 本题用AC自动机太慢,应该用Fail树将AC自动机中所有的Fail指针反向得到一个新树,这就是Fail树.对长度为x的字符串a和长度为y的字符串 ...

  2. fail树

    前置技能:AC自动机 假设我们有了一个AC自动机,然后在上面进行字符串匹配. 上面是一个有四个字符串的AC自动机(abcde.aacdf.cdf.cde),虚线是fail指针,实线是转移. 这是上一次 ...

  3. 【BZOJ3172】[Tjoi2013]单词 AC自动机

    [BZOJ3172][Tjoi2013]单词 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input ...

  4. 【BZOJ3172】单词(AC自动机)

    [BZOJ3172]单词(AC自动机) 题面 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input ...

  5. BZOJ3172 [Tjoi2013]单词 字符串 SA ST表

    原文链接http://www.cnblogs.com/zhouzhendong/p/9026543.html 题目传送门 - BZOJ3172 题意 输入$n(n\leq 200)$个字符串,保证长度 ...

  6. 【bzoj3172】 Tjoi2013—单词

    http://www.lydsy.com/JudgeOnline/problem.php?id=3172 (题目链接) 题意 $n$个单词组成文本,问每个单词在文本中出现了几次. Solution 题 ...

  7. 【bzoj3172】: [Tjoi2013]单词 字符串-AC自动机

    [bzoj3172]: [Tjoi2013]单词 先用所有单词构造一个AC自动机 题目要求的是每个单词在这个AC自动机里匹配到的次数 每次insert一个单词的时候把路径上的cnt++ 那么点p-&g ...

  8. BZOJ3172&&lg3966 TJOI单词(广义后缀自动机)

    BZOJ3172&&lg3966 TJOI单词(广义后缀自动机) 题面 自己找去 HINT 给出多个文本串,让你查找每个文本串一共出现了多少次,广义后缀自动机建出parent tree ...

  9. BZOJ3172: [Tjoi2013]单词

    传送门 做了这么多题怎么还是无法很好的理解AC自动机呢..果然是个制杖 首先题意表述不是很清晰,这些所有的单词组成了那个文章,所以果断建个AC自动机,建的时候给每个点附加一个权值,建树是经过一次权值即 ...

随机推荐

  1. 【转】CentOS下MySQL忘记root密码解决方法

    原文转自:http://www.cnblogs.com/sbaicl/articles/3132010.html 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在 ...

  2. xxl_job springboot改造

    代码地址:https://gitee.com/sharehappy/xxl_job_springboot 官方文档:https://github.com/xuxueli/xxl-job/blob/ma ...

  3. HDU-6315:Naive Operations(线段树+思维)

    链接:HDU-6315:Naive Operations 题意: In a galaxy far, far away, there are two integer sequence a and b o ...

  4. Hyperledger Fabric CouchDB as the State Database——使用CouchDB

    使用CouchDB作为状态数据库 状态数据库选项 状态数据库包括LevelDB和CouchDB.LevelDB是嵌入在peer进程中的默认键/值状态数据库,CouchDB是一个可选的外部状态数据库.与 ...

  5. music, let's go

    最近研究个新玩意,叫window.AudioContext;不懂?没关系,我也是才接触,这完全可以说个全新领域,这玩意干啥的?顾名思义,媒体上下文,也就是你媒体的数据分析,就是一串数据啊?那有啥用呢? ...

  6. 关于JavaScript定时器我的一些小理解

    因为自己在平时工作中,有些功能需要用到定时器,但是定时器并不像我们表边上看到的那样,所以这周末我看看书查查资料,深入研究了一下JavaScript中的定时器,那么废话不多说,下面进入我们今天的正题. ...

  7. BIND的安装配置

    简介 bind是dns协议的一种实现,也就是说,bind仅仅是实现DNS协议的一种应用程序 bind运行后的进程名叫named,不叫bind bind bind的配置文件在:/etc/named.co ...

  8. springmvc值传递

    1.页面向后台传值 A.HttpServletRequest方式: package com.rong.controller; import javax.annotation.Resource; imp ...

  9. psp 第二周

    11号                                                                              12号 类别c 内容c 开始时间s 结 ...

  10. php PDO操作类

    <?php /*//pdo连接信息 $pdo=array("mysql:host=localhost;dbname=demo;charset=utf8","root ...