3172: [Tjoi2013]单词

Time Limit: 10 Sec   Memory Limit: 512 MB

Submit: 268  
Solved: 145

[
Submit][
Status]

Description

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

Input

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

Output

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

Sample Input

3
a
aa
aaa

Sample Output

6
3
1

上一次写RMQ是什么时候?(喂,离题了)

好吧……

第一题后缀数组

不想写下去了……(快哭了TNT)

这题在BZOJ上内存很容易开过(5人组-》TLE/CE/MLE/RE/AC)

大家要是这题RE把数组开小点。别忘了[RMQ*20]数组+数组之和 //省空间

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define INF (2139062143)
#define F (1000000009)
#define MAXN (300+10)
#define MAXL (1000200+10)
#define eps (1e-9)
typedef long long ll;
char s[MAXL];
int n,pre[MAXN],tai[MAXN];
int w[MAXL],sa[MAXL],wa[MAXL*2]={0},wb[MAXL*2]={0};
// x-->上一行 y->下一行sa右值 wv-->y的左值 sa-->上次排名(求)
bool cmp(int *a,int x,int y,int l){return (a[x]==a[y]&&a[x+l]==a[y+l]);}
void suffix_array(int n,int m)
{
int *x=wa,*y=wb;
For(i,m) w[i]=0;
For(i,n) w[x[i]=s[i]]++;
Fork(i,2,m) w[i]+=w[i-1];
ForD(i,n) sa[w[x[i]]--]=i;
for(int j=1,p=0;p<n;j*=2,m=p)
{ p=0;
Fork(i,n-j+1,n) y[++p]=i;
For(i,n) if (j<sa[i]) y[++p]=sa[i]-j; For(i,m) w[i]=0;
For(i,n) w[x[i]]++;
For(i,m) w[i]+=w[i-1]; ForD(i,n) sa[w[x[ y[i] ]]--]=y[i];
//y is release p=y[sa[1]]=1;
Fork(i,2,n)
y[sa[i]]=(p+=(!cmp(x,sa[i-1],sa[i],j))); int *t=x;x=y;y=t;
}
}
int height[MAXL],rank[MAXL]; //height[i] 表示 sa[i]与sa[i-1]的最长公共前缀
void make_height(char *s,int n)
{
For(i,n) rank[sa[i]]=i;
For(i,n)
{
if (rank[i]==1) continue; //求height[rank[i]]
int j=max(0,height[rank[i-1]]-1),k=sa[rank[i]-1];
while (s[i+j]==s[k+j]) j++;
height[rank[i]]=j;
}
}
int bin[MAXN]={0},f[MAXL][24]={0};
int lcp(int l,int r)
{
int len=r-l+1,j=(int)log2(len);
return min(f[l][j],f[r-bin[j]+1][j]);
}
int main()
{
// freopen("bzoj3172.in","r",stdin);
scanf("%d",&n);pre[1]=1;
For(i,n)
{
scanf("%s",s+pre[i]);
tai[i]=strlen(s+pre[i]);
s[pre[i]+tai[i]]='#';
pre[i+1]=pre[i]+tai[i]+1;
}
s[pre[n+1]]=0; suffix_array(pre[n+1]-1,200); make_height(s,pre[n+1]-1); int logn=int(log2((double)pre[n+1]-1)+1);
bin[0]=1;
For(i,logn) bin[i]=bin[i-1]<<1;
For(i,pre[n+1]-1) f[i][0]=height[i]; For(j,logn)
For(i,pre[n+1]-1-(1<<j)+1)
f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]); For(i,n)
{
int tot=1;
int j=rank[pre[i]]+1;
{
int l=2,r=j-1,ans=0;
while (l<=r)
{
int m=l+r>>1;
if (lcp(m,j-1)>=tai[i]) ans=m,r=m-1;
else l=m+1;
}
if (ans) ans=j-1-ans+1;
tot+=ans;
}
{
int l=j,r=pre[n+1]-1,ans=0;
while (l<=r)
{
int m=l+r>>1;
if (lcp(j,m)>=tai[i]) ans=m,l=m+1;
else r=m-1;
}
if (ans) ans=ans-j+1;
tot+=ans;
}
cout<<tot<<endl;
}
// while (1);
return 0;
}

BZOJ 3172([Tjoi2013]单词-后缀数组第一题+RMQ)的更多相关文章

  1. BZOJ 3172 Tjoi2013 单词 后缀数组

    题目大意:给定一个n个单词的文章,求每一个单词在文章中的出现次数 文章长度<=10^6(不是单词长度<=10^6,不然读入直接超时) 首先将全部单词用空格连接成一个字符串.记录每一个单词的 ...

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

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

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

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

  4. ●BZOJ 3172 [Tjoi2013]单词

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3172 题解: 把单词逐个接起来,中间用互不相同的字符连接,并记录下每个单词的首字母在串中的位 ...

  5. [BZOJ 3172] [Tjoi2013] 单词 【AC自动机】

    题目链接:BZOJ - 3172 题目分析: 题目要求求出每个单词出现的次数,如果把每个单词都在AC自动机里直接跑一遍,复杂度会很高. 这里使用AC自动机的“副产品”——Fail树,Fail树的一个性 ...

  6. BZOJ 3172 [Tjoi2013]单词 AC自己主动机(fail树)

    题意:链接 方法:AC自己主动机与fail树性质 解析:复习AC自己主动机的第一道题?(真正的第一题明明是又一次写了遍hdu2222! ) 这题说实话第一眼看上去就是个sb题,仅仅要建出来自己主动机. ...

  7. 【刷题】BZOJ 3172 [Tjoi2013]单词

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

  8. bzoj 3172 [Tjoi2013]单词(fail树,DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3172 [题意] 题目的意思是这样的,给若干个单词,求每个单词在这一堆单词中的出现次数. ...

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

    题目链接:[http://www.lydsy.com/JudgeOnline/problem.php?id=3172] 题意:给出一个文章的所有单词,然后找出每个单词在文章中出现的次数,单词用标点符号 ...

随机推荐

  1. android面试题 不仅仅是面试是一个很好的学习

    下面的问题是在网上找到的总结,感谢您分享!希望,我们的共同进步,找到自己心仪的公司,: 1.android dvm 流程和Linux这个过程.无论是应用程序对同一概念: 答案:dvm是dalivk虚拟 ...

  2. MySQL如何修改root密码

    MySQL修改用户密码         因为长期不登录MySQL数据库,登录时经常忘记root权限密码.本文提供一个在数据库服务器上修改root密码的方法,本文撰写基础是在xp操作系统下进行. 第一步 ...

  3. IP分类地址——a,b,c 类是如何划分的

    今天IP网络使用32位地址,点分十进制格式,如172.16.0.0.地址格式:IP地址=网络地址+主机地址 或 IP地址=主机地址+子网地址+主机地址. IP地址类型 当互联网最初的设计,为了便于网络 ...

  4. Opencv各个版本的万能头文件

    每次下载opencv的新版本时,都需要重新写头文件,更改链接库配置,很麻烦有木有?下面这个头文件是我在别人的代码中淘出来的,很不错,与大家分享~(具体作者忘记了,不好意思啊) 作者很巧妙地利用Open ...

  5. Apache Commons IO入门教程(转)

    Apache Commons IO是Apache基金会创建并维护的Java函数库.它提供了许多类使得开发者的常见任务变得简单,同时减少重复(boiler-plate)代码,这些代码可能遍布于每个独立的 ...

  6. Pods was rejected as an implicit dependency for &#39;libPods.a&#39; because its architectures &#39;x86_64&#39; didn

    引入cocoaPods后.第一次编译,或者运行update后 可能报这个错误: Pods was rejected as an implicit dependency for 'libPods.a' ...

  7. Virtualbox mouse move in and out and file share with windows

    How to use Virstalbox to share files with Linux and Windows, and to move the mouse in and out Virtua ...

  8. 找工作笔试面试那些事儿(8)---常问的CC++基础题

    这一部分是C/C++程序员在面试的时候会被问到的一些题目的汇总.来源于基本笔试面试书籍,可能有一部分题比较老,但是这也算是基础中的基础,就归纳归纳放上来了.大牛们看到一笑而过就好,普通人看看要是能补上 ...

  9. cocos2d-x(十二)Lua开发飞机大战-7-加入敌机

    Lua本是一门面向过程的解释性语言.但在开发过程中有很多人还是习惯于面向对象编程.在Lua中我们能够使用table模拟类.只是写起来不太爽(特别是在继承一些C++类的时候).通过查看演示样例.发现co ...

  10. Windows内核

    每天我们都在使用Windows系统学习.编程.听音乐.玩游戏,Windows的操作想来是非常熟练了,但是你又对Windows究竟了解多少呢?本系列的目的,就是让你对Windows系统有个更直观.更清楚 ...