蒟蒻也能写出来的AC代码!这题是AC自动机模板题。插入单词时用一个没出现过的字符隔开就行了。

一些细节请看注释

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
char a[1000005], b[1000205];//b数组要开这么大,因为要在所有单词拼起来之外再加n个#号
int n, len, mp[205], all, cnt[205];
queue<int> d;
struct ACzdj{
int siz, s[1000005][26], val[1000005], lst[1000005], fai[1000005];
int u, v;
void ins(int k){
u = 0;
len = strlen(a);
for(int i=0; i<len; i++)
b[all+i] = a[i];
all += len;
b[all++] = '#';
for(int i=0; i<len; i++){
v = a[i] - 'a';
if(!s[u][v]) s[u][v] = ++siz;
u = s[u][v];
}
if(!val[u]) val[u] = k;
mp[k] = val[u];//mp[k]记录的是与第k号单词相同的单词的最小编号,这样可以解决重复单词。
}
void getFail(){
for(int i=0; i<26; i++)
if(s[0][i])
d.push(s[0][i]);
while(!d.empty()){
u = d.front();
d.pop();
for(int i=0; i<26; i++){
v = s[u][i];
if(v){
fai[v] = s[fai[u]][i];
lst[v] = val[fai[v]]?fai[v]:lst[fai[v]];
d.push(v);
}
else s[u][i] = s[fai[u]][i];
}
}
}
void query(){
u = 0;
for(int i=0; i<all; i++){
if(b[i]=='#'){
u = 0;//记得置零
continue;
}
u = s[u][b[i]-'a'];
if(val[u]) cnt[val[u]]++;
v = lst[u];
while(v){
cnt[val[v]]++;
v = lst[v];
}
}
for(int i=1; i<=n; i++)
printf("%d\n", cnt[mp[i]]);
}
}ac;
int main(){
cin>>n;
for(int i=1; i<=n; i++)
scanf("%s", a), ac.ins(i);
ac.getFail();
ac.query();
return 0;
}

bzoj3172 luogu3966 [TJOI2013]单词的更多相关文章

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

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

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

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

  3. 【bzoj3172】 Tjoi2013—单词

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

  4. 【bzoj3172】 [Tjoi2013]单词

    题目描述 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. 输入 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个 ...

  5. BZOJ3172:[TJOI2013]单词——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3172 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单 ...

  6. Luogu-3966 [TJOI2013]单词

    这道题应该是后缀数组的套路题啊,把单词连接起来,中间用没有出现过且互不相同的字符来分隔开,求一下\(height\)数组. 对于一个单词来说,设单词长\(len\),所在的后缀为\(i\),如果某后缀 ...

  7. 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)

    点此看题面 大致题意: 给你\(N\)个单词,请你求出每一个单词在这\(N\)个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. \(AC\)自动机 这是一道\(AC\)自动机的简 ...

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

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4293  Solved: 2083 [Submit][Stat ...

  9. BZOJ3172 & 洛谷3966 [Tjoi2013]单词 【fail树】

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4293  Solved: 2083 [Submit][Stat ...

随机推荐

  1. Netty之WebSocket和四种IO介绍

    Netty简介 一.什么是netty? 高性能 事件驱动 异步非堵塞 基于NIO的客户端,服务器端编程框架 稳定性和伸缩性 二.Netty的使用场景 高性能领域   多线程并发领域   异步通信领域 ...

  2. 【简问】一些个人不会的问题,收到解答经核实OK的会在下方附注答案

    1.p标签内放行内块(如,input)适宜么(已知p是块元素,但p内不宜放置div)? 2.如何单独设置文字下划线颜色? 3.行内元素可以定位吗? 4.支持 margin:0 auto; 的元素类型有 ...

  3. ArcGIS Server 10.1发布GP服务

    ArcGIS Server 10.1发布GP服务 ArcGIS Server 10.1发布GP服务确实更简单了,只是刚使用不怎么习惯.ArcGIS Server 10.1发布GP服务需要先在ArcCa ...

  4. redmine安装详解

    1.Linux:centos6.4(32位)2.Gcc的编译环境.使用make命令编辑.yum install gcc-c++ 3.PCRE PCRE(Perl Compatible Regular ...

  5. COGS 1215. [Tyvj Aug11] 冗余电网

    ★   输入文件:ugrid.in   输出文件:ugrid.out   简单对比时间限制:1 s   内存限制:128 MB TYVJ八月月赛提高组第2题 测试点数目:5 测试点分值:20 --内存 ...

  6. 使Win10用户获得特殊权限以便删除相应文件(夹)

    依次访问: 本地用户和组(右击“此电脑”): 用户: 右击:当前用户名: 属性: 添加: 输入:System Managed Accounts Group: 检查名称(可选): 确定: 重启电脑. 参 ...

  7. BZOJ 4423: [AMPPZ2013]Bytehattan 并查集+平面图转对偶图

    4423: [AMPPZ2013]Bytehattan Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 277  Solved: 183 [Submit ...

  8. Python-OpenCV——亮度和对比度

    亮度与对比度 亮度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. OpenCV中亮度和对比度应用这个公式来计算:g(x) = αf ...

  9. phpmyadmin设置不密码,不登录直接进入

    1.config.sample.inc.php改为config.inc.php 2.加入或更改代码: [php] $cfg['Servers'][$i]['auth_type'] = 'config' ...

  10. nginx之HTTP模块配置

     listen   指令只能使用与server字段里 如果本地调用可以监听本地Unix套接字文件,性能更加,因为不用走内核网络协议栈 listen unix:/var/run/nginx.sock; ...