关闭

【bzoj4199】[Noi2015]品酒大会 后缀自动机

629人阅读 评论(0) 收藏 举报
分类:

听说对反串建SAM,fa树就是后缀树?

听说两个后缀的LCP就是LCA的mx?

然后就是个树上dp?

靠,老子边界打错了


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 600010

using namespace std;

int head[maxn],next[2*maxn],to[2*maxn];
int ch[maxn][26],fa[maxn],mx[maxn],a[maxn],w[maxn],size[maxn];
char s[maxn];
long long cnt[maxn],ans[maxn];
long long MX[maxn],MN[maxn];
int n,m,num,tot=1,last=1;

void insert(int x,int W)
{
	int p=last,np=last=++tot;
	mx[np]=mx[p]+1;w[np]=W;
	while (p && !ch[p][x]) ch[p][x]=np,p=fa[p];
	if (!p) fa[np]=1;
	else
	{
		int q=ch[p][x];
		if (mx[q]==mx[p]+1) fa[np]=q;
		else
		{
			int nq=++tot;w[nq]=1e9+1;mx[nq]=mx[p]+1;
			memcpy(ch[nq],ch[q],sizeof(ch[q]));
			fa[nq]=fa[q];
			fa[np]=fa[q]=nq;
			while (p && ch[p][x]==q) ch[p][x]=nq,p=fa[p];
		}
	}
}

void addedge(int x,int y) {num++;to[num]=y;next[num]=head[x];head[x]=num;}

void dfs(int x)
{
	MX[x]=-1e9-1;MN[x]=1e9+1;size[x]=0;
	if (w[x]!=1e9+1) size[x]=1,MX[x]=MN[x]=w[x];
	for (int p=head[x];p;p=next[p])
	{
		dfs(to[p]);
		if (MX[x]!=-1e9-1 && MN[x]!=1e9+1 && MX[to[p]]!=-1e9-1 && MN[to[p]]!=1e9+1) 
		  ans[mx[x]]=max(ans[mx[x]],max(MX[x]*MX[to[p]],MN[x]*MN[to[p]]));
		MX[x]=max(MX[x],MX[to[p]]);MN[x]=min(MN[x],MN[to[p]]);
		cnt[mx[x]]+=1ll*size[x]*size[to[p]];size[x]+=size[to[p]];
	}
}

int main()
{
	scanf("%d",&n);
	scanf("%s",s+1);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	for (int i=n;i>=1;i--) insert(s[i]-'a',a[i]);
	for (int i=1;i<=tot;i++) addedge(fa[i],i);
	for (int i=0;i<=n;i++) ans[i]=-1e18;
	w[1]=1e9+1;
	dfs(1);
	for (int i=n-1;i>=0;i--) cnt[i]+=cnt[i+1],ans[i]=max(ans[i],ans[i+1]);
	for (int i=0;i<=n-1;i++) if (cnt[i]) printf("%lld %lld\n",cnt[i],ans[i]); else printf("0 0\n");
	return 0;
}


0
0
查看评论

【BZOJ 4199】[Noi2015]品酒大会 后缀自动机构造后缀树+dp

题面:http://uoj.ac/problem/131(BZOJ肿么了qaq) 如果连后缀自动机为什么可以转成后缀树都不知道的,先去切3238差异:http://blog.csdn.net/pbihao/article/details/53905995 我们先构造出后缀自动机,然后转成后缀树,...
  • pbihao
  • pbihao
  • 2016-12-28 14:41
  • 308

NOI 2015 品酒大会

#131. 【NOI2015】品酒大会 一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加。 在大会的晚餐上,调酒师 Rainbow 调制了 n 杯鸡尾酒。这 n 杯鸡尾酒排成一行,其中第 ...
  • miaomiao_ymxl
  • miaomiao_ymxl
  • 2017-01-20 23:32
  • 286

bzoj4199&uoj131: [Noi2015]品酒大会

传送门:http://uoj.ac/problem/131 思路:先求出height,然后根据排名重新给后缀标号,按height从大到小做,每次合并i和i-1,用并查集维护,更新答案。 #include #include #include #define max(a,b) (a>b?a:b...
  • thy_asdf
  • thy_asdf
  • 2015-08-16 16:23
  • 1500

[bzoj4199][NOI2015]品酒大会

4199: [Noi2015]品酒大会Time Limit: 10 Sec Memory Limit: 512 MB Submit: 418 Solved: 231 [Submit][Status][Discuss] Description一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包...
  • FZHvampire
  • FZHvampire
  • 2016-04-18 17:47
  • 619

BZOJ4199 NOI2015 品酒大会 题解&代码

并查集维护…着急回宿舍(浪)明天再写详细题解/************************************************************** Problem: 4199 User: Rainbow6174 Language: C++ Re...
  • Rainbow6174
  • Rainbow6174
  • 2016-03-09 22:07
  • 749

【NOI2015】【BZOJ4199】品酒大会

DescriptionInputOutputSample InputSample OutputHINTSource BZOJ无题面233 反正网上一堆自己下载叭>_< 对反串建SAM然后DP 第一问和AHOI2013差异完全一样 具体解法: 设Ans1[i]为lcp恰为i的后...
  • CreationAugust
  • CreationAugust
  • 2015-08-26 10:37
  • 3319

[BZOJ4199][Noi2015]品酒大会(后缀数组+并查集)

题目描述传送门题解别出心裁的一道sa,想了好久。。40ptsO(n2)O(n^2)的做法应该很好想吧 sa+st表就可以了qwq100pts首先求出height数组 考虑如果只求一个r的话怎么做 显然可以将height数组分组,每个组里都是height>=r的,然后对于每一个组计数+取m...
  • Clove_unique
  • Clove_unique
  • 2017-02-16 11:27
  • 339

【BZOJ4199】品酒大会,后缀数组+并查集维护

烦死了
  • xym_CSDN
  • xym_CSDN
  • 2016-05-23 22:11
  • 312

[BZOJ4199][Noi2015]品酒大会

首先是正解部分… 我们先用后缀数组将后缀排序并得到hei数组… 然后正解的做法是用合并后缀集合的方法维护信息(太神了自己想根本想不到OLZ…
  • Zvezda_
  • Zvezda_
  • 2015-09-03 23:54
  • 350

[BZOJ4199] [Noi2015]品酒大会

传送门http://www.lydsy.com/JudgeOnline/problem.php?id=4199题目大意给定以i开始的所有子串权值为ai给定以i开始的所有子串权值为a_i 询问所有子串中lcp(i,j)(从i开始和从j开始的子串)<=1..n−1的对数以及max{ai∗aj}询...
  • slongle_amazing
  • slongle_amazing
  • 2016-03-01 10:31
  • 522
    个人资料
    • 访问:192421次
    • 积分:4915
    • 等级:
    • 排名:第6868名
    • 原创:305篇
    • 转载:0篇
    • 译文:0篇
    • 评论:72条
    最新评论