博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[TJOI2013]单词
阅读量:4703 次
发布时间:2019-06-09

本文共 1314 字,大约阅读时间需要 4 分钟。

2755: [TJOI2013]单词

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 6  Solved: 3
[][][]

Description

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

Input

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

Output

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

Sample Input

3aaaaaa

Sample Output

631

HINT

 

Source

 题解:
  

  求出fail树以后。。。

  对每个串的每个节点打标记

  然后输出每个串终点子树的标记个数和

#include
#include
#include
#define maxn 1000001using namespace std;int n,tot;int sum[maxn],fai[maxn],son[maxn][27],pos[201],lis[maxn];char s[maxn];void insert(int x){ scanf("%s",s+1); int p=0,nn=strlen(s+1); for (int i=1; i<=nn; i++) { if (!son[p][s[i]-'a']) son[p][s[i]-'a']=++tot; p=son[p][s[i]-'a']; sum[p]++; } pos[x]=p;}void failed(){ int head=0,tail=1; lis[1]=0; fai[0]=-1; int a; while (head
=0) fai[son[now][i]]=son[a][i]; else fai[son[now][i]]=0; } } } for (int i=tail; i>=1; i--) sum[fai[lis[i]]]+=sum[lis[i]];}int main(){ cin>>n; tot=0; for (int i=1; i<=n; i++) insert(i); failed(); for (int i=1; i<=n; i++) printf("%d\n",sum[pos[i]]); }
View Code

 

转载于:https://www.cnblogs.com/HQHQ/p/5368814.html

你可能感兴趣的文章
03007_HttpServlet
查看>>
java中经常使用的Swing组件总结
查看>>
EnoroF's Game Engine
查看>>
aar jar包打包
查看>>
Kettle
查看>>
基础知识1----传值方式调用函数--请输出结果
查看>>
day6 bytes类型用法
查看>>
源码 补码以及反码
查看>>
MVC涉及RouteTable自定义路径
查看>>
python3.6在linux持久运行django
查看>>
hibernate学习(1)——helloworld
查看>>
面向对象
查看>>
SQL 创建索引,语法
查看>>
C++primer plus第六版课后编程题答案7.5
查看>>
【建立二叉树】后序建立二叉树
查看>>
Java多线程sleep(),join(),interrupt(),wait(),notify()
查看>>
配置coffeeScript
查看>>
单链表的建立、排序和翻转
查看>>
[转]Linux Shell History (快速使用Linux命令)
查看>>
Java操作Oracle数据库以及调用存储过程
查看>>