这道题应该是后缀数组的套路题啊,把单词连接起来,中间用没有出现过且互不相同的字符来分隔开,求一下\(height\)数组。

对于一个单词来说,设单词长\(len\),所在的后缀为\(i\),如果某后缀\(j\)满足\(lcp(i,j)==len\),则\(j\)的前缀与这个单词相等。因为和\(i\)的\(lcp\)大小是从\(i\)向两边递减的,所以可以分别从后往前,从前往后两遍单调栈找出左右最远能满足条件的后缀\(l,r\),区间大小\(l-r+1\)就是总数

吐槽一下这题我开始交了两遍R炸了,原因竟是加分隔符的时候加入了一些奇怪的字符...,把\(s\)改成\(int\)就好了...

#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2e6+100;
struct SA{
int sa[maxn],tp[maxn],tax[maxn],rk[maxn],h[maxn],n,m,len[300],bj[maxn];
int siz[300],st[maxn],top,tot,s[maxn];
void Qsort(){
for(int i=0;i<=m;i++) tax[i]=0;
for(int i=1;i<=n;i++) tax[rk[i]]++;
for(int i=1;i<=m;i++) tax[i]+=tax[i-1];
for(int i=n;i>=1;i--)
sa[tax[rk[tp[i]]]--]=tp[i];
}
void getsa(){
m=1000;
for(int i=1;i<=n;i++)
rk[i]=s[i],tp[i]=i;
Qsort();
for(int p=1,w=1;p<n;w<<=1,m=p){
p=0;
for(int i=1;i<=w;i++) tp[++p]=n+i-w;
for(int i=1;i<=n;i++) if(sa[i]>w) tp[++p]=sa[i]-w;
Qsort();
swap(tp,rk);
rk[sa[1]]=p=1;
for(int i=2;i<=n;i++)
rk[sa[i]]=tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+w]==tp[sa[i-1]+w]?p:++p;
}
}
void geth(){
for(int i=1,j,p=0;i<=n;h[rk[i++]]=p)
for(p?p--:p,j=sa[rk[i]-1];s[j+p]==s[i+p];p++);
}
void ycl(){
h[0]=-0x7fffffff,top=0;
for(int i=1;i<=n;i++){
while(h[st[top]]>=h[i]) top--;
if(bj[sa[i]]&&h[i]==len[bj[sa[i]]])
siz[bj[sa[i]]]=i-st[top];
st[++top]=i;
}
h[n+1]=-0x7fffffff,st[0]=n+1,top=0;
for(int i=n-1;i>=1;i--){
while(h[st[top]]>=h[i+1]) top--;
if(bj[sa[i]]&&h[i+1]==len[bj[sa[i]]]) siz[bj[sa[i]]]+=st[top]-i-1;
st[++top]=i+1;
}
}
}sa;
int n,m;
char a[maxn];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",a+1);
m=strlen(a+1);
sa.bj[sa.n+1]=i;
sa.len[i]=m;
for(int j=1;j<=m;j++)
sa.s[++sa.n]=a[j];
sa.s[++sa.n]='z'+i;
}
sa.getsa(),sa.geth(),sa.ycl();
for(int i=1;i<=n;i++)
printf("%d\n",sa.siz[i]+1);
return 0;
}

Luogu-3966 [TJOI2013]单词的更多相关文章

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

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

  2. Luogu P3966 [TJOI2013]单词

    题目链接 \(Click\) \(Here\) 本题\(AC\)自动机写法的正解之一是\(Fail\)树上跑\(DP\). \(AC\)自动机是\(Trie\)树和\(Fail\)树共存的结构,前者可 ...

  3. 【洛谷】3966:[TJOI2013]单词【AC自动机】【fail树】

    P3966 [TJOI2013]单词 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出 ...

  4. 洛谷P3966 [TJOI2013]单词(fail树性质)

    P3966 [TJOI2013]单词 题目链接:https://www.luogu.org/problemnew/show/P3966 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单 ...

  5. BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status ...

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

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

  7. 3172: [Tjoi2013]单词

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3246  Solved: 1565[Submit][Status ...

  8. BZOJ 3172([Tjoi2013]单词-后缀数组第一题+RMQ)

    3172: [Tjoi2013]单词 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 268   Solved: 145 [ Submit][ St ...

  9. [TJOI2013]单词

    2755: [TJOI2013]单词 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 3[Submit][Status][Web B ...

  10. P3966 [TJOI2013]单词

    P3966 [TJOI2013]单词 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出 ...

随机推荐

  1. Quartz.NET 作业调度

    Quartz 简介: Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调 ...

  2. SQL Server 还原错误“restore database正在异常终止 错误 3154”

    今天在还原数据库时,先建立相同名字的数据库,然后在该数据库上右键还原数据库.遇到了这样的一个错误: “备份集中的数据库备份与现有的 'RM_DB' 数据库不同. RESTORE DATABASE 正在 ...

  3. 【BZOJ3124】[Sdoi2013]直径 树形DP(不用结论)

    [BZOJ3124][Sdoi2013]直径 Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节 ...

  4. 关于angularjs中的ng-class的使用

    在angularjs中,包子认为ng-class的用法是相当的大,这个相当于jquery的addClass和removeClass.在这个地方,废话不多说,直接上一小段代码 当kefu这个变量为真的时 ...

  5. C#反射 程序域

    1:加载dll到当前应用程序域: public static void LoadAllAssembly(string bindir) //bindir是dll所在的完整路径 { List<Ass ...

  6. 学习Hive和Impala必看经典解析

    Hive和Impala作为数据查询工具,它们是怎样来查询数据的呢?与Impala和Hive进行交互,我们有哪些工具可以使用呢? 我们首先明确Hive和Impala分别提供了对应查询的接口: (1)命令 ...

  7. hibernate 操作 Postgresql 数据库报 operator does not exist: integer = character varying

    网上的说法如下: Java开发Postgresql 数据库兼容应用的问题,与Oracle有一些不同: Java类型映射数据库类型的不同,Oracle jdbc驱动程序处理Java String类型可正 ...

  8. Boostrap常用组件英文名

    dropdownlisttabsearchVertical TabSidebar with tabssidebarExpandable Panel ListFiltered Attendees Lis ...

  9. [转] 我所经历的IBM SOA与系统整合

    2006年,一汽大众新上来一位总经理,新加坡人,整个一国际背景高端管理人才,是德国人和中国人博弈后取得的胜利. 一汽大众过去是从总部到区域到终端一体化的大盘管理模式,很僵化很粘稠,不利用快速反应.于是 ...

  10. 生成sql表结构

    DataConstruct.php <?php /** * Created by PhpStorm. * User: Administrator * Date: 2017/7/21 * Time ...