博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1659 [国家集训队]拉拉队排练
阅读量:5874 次
发布时间:2019-06-19

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

思路

求出cnt和len之后,直接乘起来即可

代码

#include 
#include
#include
#define int long longusing namespace std;int Nodecnt,last,n,k;signed trans[1001000][26],fail[1001000];struct Node{ signed len,cnt; bool operator < (const Node &b) const{ return len>b.len; }}a[1001000];char s[1001000];const int MOD = 19930726;int pow(int a,int b){ int ans=1; while(b){ if(b&1) ans=(1LL*ans*a)%MOD; a=(1LL*a*a)%MOD; b>>=1; } return ans;}int New_state(int _len){ a[Nodecnt].len=_len; return Nodecnt++;}int get_fail(int p,int n){ while(s[n]!=s[n-a[p].len-1]) p=fail[p]; return p;}void insert(int n){ int cur=get_fail(last,n); if(!trans[cur][s[n]]){ int t=New_state(a[cur].len+2); fail[t]=trans[get_fail(fail[cur],n)][s[n]]; trans[cur][s[n]]=t; } a[trans[cur][s[n]]].cnt++; last=trans[cur][s[n]];}signed main(){ // freopen("test.in","r",stdin); int ans=1; scanf("%lld %lld",&n,&k); scanf("%s",s+1); s[0]=-1; New_state(0); fail[0]=1; New_state(-1); last=0; for(int i=1;i<=n;i++){ s[i]-='a'; insert(i); } for(int i=Nodecnt-1;i>=0;i--) a[fail[i]].cnt+=a[i].cnt; sort(a,a+Nodecnt); for(int i=0;i
0;i++){ if(a[i].len%2){ ans=(1LL*ans*pow(a[i].len,min(1LL*a[i].cnt,k)))%MOD; k-=a[i].cnt; } } printf("%lld\n",ans); return 0;}

转载于:https://www.cnblogs.com/dreagonm/p/10753007.html

你可能感兴趣的文章
构建根文件系统(5)构建dev目录
查看>>
volatile修饰函数的返回值
查看>>
经济周期
查看>>
No module named mysqldb
查看>>
(转)File's Owner 和 First Responder的区别
查看>>
oracle中的NVL,NVL2,NULLIF,COALESCE函数使用
查看>>
上班族的坐姿
查看>>
ubuntu 12.04 下面安装vmware workstation 8.0.4
查看>>
[原创]FineUI秘密花园(二十三) — 树控件概述
查看>>
【Java学习笔记】如何写一个简单的Web Service
查看>>
VS2010技巧:如何在js文件中使用jQuery智能感知
查看>>
Oracle常用脚本——通过RMAN配置RAC环境的分布式磁带机
查看>>
UML建模类型(转载)
查看>>
Xcode 文档注释
查看>>
转载——Java与WCF交互(二):WCF客户端调用Java Web Service
查看>>
Html5 学习系列(五)Canvas绘图API快速入门(1)
查看>>
JQuery html API支持解析执行Javascript脚本功能实现-代码分析
查看>>
Web Service测试工具小汇
查看>>
如何解决This system is not registered with RHN.
查看>>
Cocos2d-x学习笔记(两)Cocos2d-x总体框架
查看>>