\(\color{#0066ff}{ 题目描述 }\)

小张最近在忙毕设,所以一直在读论文。一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次。

\(\color{#0066ff}{输入格式}\)

第一行一个整数N,表示有N个单词。接下来N行每行一个单词,每个单词都由小写字母(a-z)组成。(N≤200)

\(\color{#0066ff}{输出格式}\)

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

\(\color{#0066ff}{输入样例}\)

3
a
aa
aaa

\(\color{#0066ff}{输出样例}\)

6
3
1

\(\color{#0066ff}{数据范围与提示}\)

30%的数据, 单词总长度不超过\(10^3\)

100%的数据,单词总长度不超过\(10^6\)

\(\color{#0066ff}{ 题解 }\)

SAM,你是真的优秀啊

把所有串以一个无关字符间隔拼起来插入SAM

然后统计鸡排统计siz

在SAM上暴力匹配

\(O(n)\)

#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL in() {char ch; int x = 0, f = 1;while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));return x * f;
}
const int maxn = 2e6 + 255;
struct SAM {
protected:struct node {node *fa, *ch[27];int len, siz;node(int len = 0, int siz = 0): fa(NULL), len(len), siz(siz) {memset(ch, 0, sizeof ch);}};node *root, *tail, *lst;node pool[maxn], *id[maxn];int c[maxn];void extend(int c) {node *o = new(tail++) node(lst->len + 1, 1), *v = lst;for(; v && !v->ch[c]; v = v->fa) v->ch[c] = o;if(!v) o->fa = root;else if(v->len + 1 == v->ch[c]->len) o->fa = v->ch[c];else {node *n = new(tail++) node(v->len + 1), *d = v->ch[c];std::copy(d->ch, d->ch + 27, n->ch);n->fa = d->fa, d->fa = o->fa = n;for(; v && v->ch[c] == d; v = v->fa) v->ch[c] = n;}lst = o;}
public:void clr() {tail = pool;root = lst = new(tail++) node();}SAM() { clr(); }void ins(char *s) { for(char *p = s; *p; p++) extend(*p - 'a'); }void getsiz() {int maxlen = 0;for(node *o = pool; o != tail; o++) c[o->len]++, maxlen = std::max(maxlen, o->len);for(int i = 1; i <= maxlen; i++) c[i] += c[i - 1];for(node *o = pool; o != tail; o++) id[--c[o->len]] = o;for(int i = tail - pool - 1; i; i--) {node *o = id[i];if(o->fa) o->fa->siz += o->siz;}}int getans(char *s) {node *o = root;for(char *p = s; *p; p++) o = o->ch[*p - 'a'];return o->siz;}
}sam;
char s[201][1000011], t[1000011];
int main() {int n = in();char *q = t;for(int i = 1; i <= n; i++) {scanf("%s", s[i]);for(char *p = s[i]; *p; p++) *q++ = *p;*q++ = 'z' + 1;}sam.ins(t);sam.getsiz();for(int i = 1; i <= n; i++) printf("%d\n", sam.getans(s[i]));return 0;
}

转载于:https://www.cnblogs.com/olinr/p/10255052.html

P3966 [TJOI2013]单词相关推荐

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

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

  2. bzoj 3172: [Tjoi2013]单词 AC自动机

    3172: [Tjoi2013]单词 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  3. fail树(bzoj 3172: [Tjoi2013]单词)

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

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

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

  5. BZOJ3172: [Tjoi2013]单词

    [传送门:BZOJ3172] 简要题意: 给出n个单词,你可以理解为将这些单词变成一个个段落,然后求出每个单词在所有段落中出现的次数 题解(一): 刚开始不是很懂题目,结果发现将所有单词看成一篇文章, ...

  6. BZOJ3172 TJOI2013 单词

    传送门 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词, ...

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

    点此看题面 大致题意: 给你NNN个单词,请你求出每一个单词在这NNN个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. LinkLinkLink [洛谷3796][模板]AC自动 ...

  8. [TJOI2013] 单词

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

  9. bzoj3172:[Tjoi2013]单词

    传送门 看着就是裸的AC自动机是不是?会T一个点 然而...为什么放过暴力KMP和暴力find,理论复杂度\(O(nm)\)起步啊 AC自动机加一个树上差分就好啦,对于每个字符串的查询,实际上都是在f ...

最新文章

  1. mysql数据库验证登陆不上_MySQL数据库连接不上、密码修改问题
  2. Intel汇编语言程序设计学习-第五章 过程-上
  3. 从volatile说到i++的线程安全问题
  4. Scrapy:python3下的第一次运行测试 1
  5. C# OLE DB 的连接方式下 对 sql 参数的操作 需要改成 ? 号
  6. 在CentOS7上安装vim编辑器报错无法解析阿里云主机
  7. 【Codeforces Round #442 (Div. 2) C】Slava and tanks
  8. php模板怎么导入数据类型,smarty模板引擎之分配数据类型,smarty模板数据类型_PHP教程...
  9. android手机和荣耀哪个版本好,【求测评】荣耀v40轻奢版与荣耀X10哪款更好?图文爆料分析...
  10. TwinCAT 3 xml存储配置文件程序
  11. Jetson Nano 系列之:25FPS性能优化之路
  12. Elastic Stack最佳实践系列:Beats->ES,一个更轻型的架构选择
  13. linux病毒通过U盘传播,一个通过U盘传播的病毒详细分析,近期抓的但是是09年的病毒...
  14. 百度网盘如何免费上传大于4GB的文件(制作BT文件)
  15. java-net-php-python-SSM的美工接单系统计算机毕业设计程序
  16. 电脑常用快捷键【按使用场景分类】-Windows
  17. 基于python的中文词频分析
  18. 【基础】信息时代与计算机
  19. r5处理器_联想拯救者r7000 r7与r5哪个更值得买?差距大吗?下面价格和配置对比评测看完就明白了...
  20. java网上下载文件

热门文章

  1. 【windows环境——VSCode安装教程】
  2. 【HDU - 5475】An easy problem(线段树,思维)
  3. 【HDU - 3746 】Cyclic Nacklace (KMP,最小循环节问题)
  4. java xsd 解析 xml文件_Java针对XSD文件验证XML文件的最佳方法是什么?
  5. mysql一张表1亿天数据_1亿条数据在PHP中实现Mysql数据库分表100张
  6. JAVA随机生成文件名:当前年月日时分秒+五位随机数
  7. PaperNotes(18)-VectorNet- Encoding HD Maps and Agent Dynamics from Vectorized Representation
  8. 大数据学习(08)--Hadoop中的数据仓库Hive
  9. 《Python Cookbook 3rd》笔记(1.6):字典中的键映射多个值
  10. 机器学习顶刊文献_人工智能顶刊TPAMI2019最新《多模态机器学习综述》