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. angular中的$http服务

    $http是ng内置的一个服务.是简单的封装了浏览器原生的XMLHttpRequest对象. 写法1 $http({ method: "GET", url: 'data.json' ...

  2. idea 安装后需要手动设置 64位的vmoptions (为了更好的性能和体验)

  3. 通知的多线程问题 iOS

    发送通知在子线程,接受也在子线程.如果子线程操作UI,会打印一推日志,告诉我们应该主线程操作.

  4. 初始CSS模板

    /*开始 初始CSS模板 开始*/ body, div, address, blockquote, iframe, ul, ol, dl, dt, dd, li, dl, h1, h2, h3, h4 ...

  5. My status

    I haven‘t any one who is strong relationship with me. My skill is normal. I'm not interesting in neg ...

  6. shell 判断日期间隔及润年

    #!/bin/bash test.sh until echo "----------------------------------" echo "请输入您的选择:&qu ...

  7. 如何使用phpredis连接Redis的方法

    本文跟大家介绍使用同一VPC内弹性云服务器ECS上的phpredis连接Redis的方法. 更多的客户端的使用方法,请参考https://redis.io/clients 前提条件 已成功申请Redi ...

  8. underscore.js源码解析(五)—— 完结篇

    最近公司各种上线,所以回家略感疲惫就懒得写了,这次我准备把剩下的所有方法全部分析完,可能篇幅过长...那么废话不多说让我们进入正题. 没看过前几篇的可以猛戳这里: underscore.js源码解析( ...

  9. LeetCode 888. Fair Candy Swap(C++)

    题目: Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that ...

  10. Scrum立会报告+燃尽图(十一月二十三日总第三十一次):界面修改及新页面添加

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2410 项目地址:https://git.coding.net/zhang ...