[BZOJ2160]拉拉队排练(回文树)

原创 2016年05月30日 21:44:23

题意:求一个字符串的长度前k的奇数长度回文串的长度的乘积模一个数。

和APIO那个回文串的题差不多,可以先manacher搞出所有本质不同的回文串,再用后缀数组查查出现了多少次即可。这里偷懒写的回文树,注意跑完了之后那个cnt需要沿着后缀链接向上传递一下。

注意那个K是10^12不是10^9。。。开的int丢了5分,还好出题人比较良心只有一个点的K超了int。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define erp(i,a,b) for(int i=a;i>=b;--i)
#define LL long long
using namespace std;
const int mo = 19930726;
const int MAXN = 1000005;
int N;
LL sum[MAXN], K;

int ksm(int a, int b)
{
	int res = 1;
	for (; b; b>>=1, a=1ll*a*a%mo)
		if(b&1) res = 1ll*res*a%mo;
	return res;
}

int ch[MAXN][26], fa[MAXN];
int cnt[MAXN], len[MAXN];
int last, n, ncnt;
char s[MAXN];
inline int NewNode(int l)
{
	return len[ncnt] = l, ncnt++;
}
void initpam()
{
	NewNode(0), NewNode(-1);
	s[0] = -1, fa[0] = 1;
}
inline int getfail(int x)
{
	while (s[n-len[x]-1] != s[n]) x = fa[x];
	return x;
}

void ins(int c)
{
	s[++n] = c;
	int cur = getfail(last);
	if (!ch[cur][c])
	{
		int now = NewNode(len[cur]+2);
		fa[now] = ch[getfail(fa[cur])][c];
		ch[cur][c] = now;
	}
	last = ch[cur][c];
	cnt[last] ++;
}

void calc()
{
	erp(i, ncnt-1, 0) cnt[fa[i]] += cnt[i];
	for (int i = 0; i<ncnt; ++i)
		if (len[i]>0&&(len[i]&1)) sum[len[i]] += cnt[i];
}

int main()
{
	freopen("rehearse.in","r",stdin);
	freopen("rehearse.out","w",stdout);
	char c;
	scanf("%d %lld\n", &N, &K);
	initpam();
	while (1)
	{
		c = getchar();
		if (c>='a'&&c<='z') ins(c-'a');
		else break;
	}
	calc();
	int ans = 1;
	for (int i = N; i; --i)
	{
		if (!(i&1)) continue;
		if (K<=sum[i]) { ans = 1ll*ans*ksm(i, K)%mo; K = 0; break; }
		else ans = 1ll*ans*ksm(i, sum[i])%mo, K -= sum[i];
	}
	if (K) puts("-1");
	else printf("%d\n", ans);
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

【bzoj2160】拉拉队排练 manacher

先用manacher求出数组后,用一个差分数组计算每一个长度的字符串出现的次数,暴力计算就好了。 #include #include #include #include #include #...
  • u012288458
  • u012288458
  • 2015年11月23日 20:22
  • 534

BZOJ2160 拉拉队排练

傻逼题……manacher求出每个长度的极长回文串都有多少个,然后把长度相等的快速幂一起乘,然后把长度-2 #include #include #include #include #include #...
  • neither_nor
  • neither_nor
  • 2016年08月15日 12:35
  • 607

bzoj3676 回文串【回文树】

解题思路:回文树模板题,建好后取每个节点cnt*len的最大值即可。 回文树解析详见:http://blog.csdn.net/u013368721/article/details/42100363...
  • cdsszjj
  • cdsszjj
  • 2017年11月23日 18:21
  • 69

BZOJ 2160 拉拉队排练 Manacher + 前缀和

题目大意: 就是现在给出一个长度为 n 的字符串(1 对于给出的长度为n的字符串如果其回文串的数量比K少则输出-1, 否则输出所有回文串中长度为奇数的最长的前K个回文串的长度的乘积, 结果对于1...
  • u013738743
  • u013738743
  • 2015年03月20日 18:53
  • 942

下拉列表Select2插件的使用

1、Select2控件介绍 这个插件是基于Select的扩展插件,能够提供更加丰富的功能和用户体验,它的github官网地址为:https://select2.github.io/,具体的使用案...
  • linbren
  • linbren
  • 2017年02月06日 09:01
  • 2622

POJ 2828 Buy Tickets(排队问题,线段树应用)

POJ 2827 Buy Tickets(排队问题,线段树应用) ACM 题目地址:POJ 2828 Buy Tickets 题意:  排队买票时候插队。  给出一些数对,分别代表某个人的想要插...
  • hcbbt
  • hcbbt
  • 2014年08月06日 00:57
  • 2231

排序(二)键索引、桶排序、位示图、败者树等(图文详解--败者树)

排序(二) 以上排序算法都有一个性质:在排序的最终结果中,各元素的次序依赖于它们之间的比较。我们把这类排序算法称为比较排序。 任何比较排序的时间复杂度的下界是nlgn。   以下排序算法是用...
  • yang_yulei
  • yang_yulei
  • 2014年05月28日 08:28
  • 6008

BZOJ2160 拉拉队排练(回文树)

HYSBZ - 2160 拉拉队排练 Time Limit: 10000MS   Memory Limit: 265216KB   64bit IO Format:...
  • u013268685
  • u013268685
  • 2015年09月12日 19:17
  • 503

HYSBZ 2160 拉拉队排练(回文树)

HYSBZ 2160 拉拉队排练(回文树)
  • Dacc123
  • Dacc123
  • 2016年05月10日 16:00
  • 594

BZOJ 2160 拉拉队排练

manacher+快速幂
  • Orion_Rigel
  • Orion_Rigel
  • 2016年05月13日 17:53
  • 293
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[BZOJ2160]拉拉队排练(回文树)
举报原因:
原因补充:

(最多只允许输入30个字)