BZOJ 4175 小G的电话本 ——NTT
后缀自动机统计出现了各种次数的串的和。
就是所谓的生成函数
然后FFT卷积即可。
卷积快速幂$n\log n \log n$
注意一下实现,可以少两次NTT
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define maxn 500005
#define md 1005060097
#define g 5 int A[maxn],B[maxn]; int rev[maxn];
const double pi=acos(-1.0); int ksm(int a,int b)
{
int ret=1;
for (;b;b>>=1,a=(ll)a*a%md) if (b&1) ret=(ll)ret*a%md;
return ret;
} void NTT(int * x,int n,int flag)
{
F(i,0,n-1) if (rev[i]>i) swap(x[rev[i]],x[i]);
for (int m=2;m<=n;m<<=1)
{
int wn=ksm(g,((md-1)/m*flag+md-1)%(md-1));
for (int i=0;i<n;i+=m)
{
int w=1;
for (int j=0;j<(m>>1);++j)
{
int u=x[i+j],v=(ll)x[i+j+(m>>1)]*w%md;
x[i+j]=(u+v)%md; x[i+j+(m>>1)]=(u-v+md)%md;
w=(ll)w*wn%md;
}
}
}
if (flag==-1)
{
int inv=ksm(n,md-2);
F(i,0,n-1) x[i]=(ll)x[i]*inv%md;
}
} int k,m,n,N,len; struct Suffix_Automaton{
int cnt,last,l[maxn],fa[maxn],go[maxn][26],siz[maxn];
int v[maxn],q[maxn];
char s[maxn];
void init(){cnt=last=1;memset(go,0,sizeof go);}
void add(int x)
{
int p=last,np=last=++cnt; l[np]=l[p]+1;
for (;p&&!go[p][x];p=fa[p]) go[p][x]=np;
if (!p) fa[np]=1;
else
{
int q=go[p][x];
if (l[q]==l[p]+1) fa[np]=q;
else
{
int nq=++cnt; l[nq]=l[p]+1;
memcpy(go[nq],go[q],sizeof go[q]);
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
for (;p&&go[p][x]==q;p=fa[p]) go[p][x]=nq;
}
}
siz[last]++;
}
void radix()
{
F(i,1,cnt) v[l[i]]++;
F(i,1,cnt) v[i]+=v[i-1];
F(i,1,cnt) q[v[l[i]]--]=i;
D(i,cnt,1) siz[fa[q[i]]]+=siz[q[i]];
}
void solve()
{
scanf("%s",s); int n=strlen(s);
init(); F(i,0,n-1) add(s[i]-'a');
radix();
}
}SAM; int main()
{
scanf("%d%d",&k,&m); SAM.solve();
F(i,2,SAM.cnt) A[SAM.siz[i]]=(A[SAM.siz[i]]+(ll)(SAM.l[i]-SAM.l[SAM.fa[i]])*SAM.siz[i]%md)%md;B[0]++;
for (n=1,len=0;n<=2*m;n<<=1) len++;
F(i,0,n-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));
F(i,m+1,n-1) B[i]=A[i]=0;
for (;k;k>>=1)
{
NTT(A,n,1);
if (k&1)
{
NTT(B,n,1);
F(i,0,n-1) B[i]=(ll)B[i]*A[i]%md;
NTT(B,n,-1);F(i,m+1,n-1) B[i]=0;
}
F(i,0,n-1) A[i]=(ll)A[i]*A[i]%md;
NTT(A,n,-1);F(i,m+1,n-1)A[i]=0;
}
printf("%d\n",(B[m]%md+md)%md);
}
BZOJ 4175 小G的电话本 ——NTT的更多相关文章
- BZOJ 4175: 小G的电话本 SAM+FFT
4175: 小G的电话本 Time Limit: 45 Sec Memory Limit: 256 MBSubmit: 195 Solved: 48[Submit][Status][Discuss ...
- BZOJ4175 : 小G的电话本
用后缀树统计出出现了x次的本质不同的子串的个数,最后再乘以x,得到一个多项式. 这个多项式常数项为0,但是一次项不为0. 于是把整个多项式除以一次项,通过多项式求ln和多项式求exp求出它的幂. 最后 ...
- [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)
[BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...
- C语言实现电话本 动态开辟 信息存储于文件
下面是我用C写的一个电话本小项目,实现的功能有:添加 删除 修改 查找 排序 清空 显示,功能还是比较全的,内存也是动态开辟的.能存储于本地,能从本地读出并显示 头文件部分代码,contact.h: ...
- BZOJ 5028 小z的加油站
bzoj链接 Time limit 10000 ms Memory limit 262144 kB OS Linux 感想 树上动态gcd的第二题也好了. [x] BZOJ 2257 [JSOI200 ...
- 微信电话本可免费拨打网络电话 通话一分钟约300K流量
微信电话本新版本于昨日晚间发布,这是一款智能通讯增强软件,通话双方都下载此APP并开通免费通话功能就能使用微信电话本拨打免费网络电话,在对方无法接通情况下还能将音频转向语音信箱,微信电话本目前支持An ...
- C++之路进阶——codevs2933(诗人小G)
2933 诗人小G 2009年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 小G是一个出色的诗人 ...
- 苹果IPhone手机由于更新了IOS7 Beta测试版导致“激活出错”后,如何还原电话本和照片方法
苹果这狗日的,手段果然狠,因为用户提前升级了测试版又没有更新正式版,就突然把手机变砖头,既不让升级正式版,也不让备份手机中的信息,确实有必要这样吗? 我的手机是IPone4s,在看了6月Apple W ...
- Android-->发送短信页面实现(短信发送以及群发和从电话本中选择联系人)-----------》2
分析下怎么写 首先,我们需要一个输入框,可以手动的输入手机号码, 其次,很少有人愿意手动输入,那么我们需要提供一个按钮来给我们的用户选择自己电话本中的联系人(一次可以选择多个即群发) 然后,我们需要一 ...
随机推荐
- kafka 开机启动脚本
/etc/init.d$ vi kafka-start-up.sh #!/bin/bash #export KAFKA_HOME=$PATH export KAFKA_HOME=/opt/Kafka/ ...
- BundleConfig的作用
在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和css进行压缩(多个文件可以打包成一个文件),并且可以区分调试和非调试,在调试时不进行压缩,以原 ...
- C# 接口慨述
接口(interface)用来定义一种程序的协定.实现接口的类或者结构要与接口的定义严格一致.有了这个协定,就可以抛开编程语言的限制(理论上).接口可以从多个基接口继承,而类或结构可以实现多个接口.接 ...
- MySQL数据库 crud语句 ifnull() 创建新账户 备份数据库 一对多关系 多对多(中间表) 外键约束 自关联 子查询注意事项 DML DDL DQL mysql面试题 truncate与delete的区别
DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL ...
- c语言中--typeof--关键字用法
C语言中 typeof 关键字是用来定义变量数据类型的.在linux内核源代码中广泛使用. 下面是Linux内核源代码中一个关于typeof实例: #define min(x, y) ({ \ typ ...
- POJ 2406 Power String
算出next数组. 对于任何一个循环字串,len-next[len]必为最小循环节长度 若len%(len-next[len])==0 即为循环字串,n=len/(len-next[len]) 否则输 ...
- SpringVC 拦截器+自定义注解 实现权限拦截
1.springmvc配置文件中配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns= ...
- Python_三级目录
程序要求: 1. 使用字典存储 1. 可以一层一层的进入到所有层2. 可以在每层返回上一层3. 可以在任意层退出 三级目录写了两个版本,第一个版本是刚看完字典写出来的,代码很多冗余,很多重复. men ...
- Flask初学者:Python虚拟环境,Flask安装,helloworld,run方法
一.Python虚拟环境: 作用:使Python框架的不同版本可以在同一台电脑上运行.如果在电脑上全局(C盘或者其他目录)安装Flask(或其他Python框架),当你使用其他版本的Flask(比如有 ...
- 笔记-python-tutorial-5.data structure
笔记-python-tutorial-5.data structure 1. data structure 1.1. list operation list.append(x) #尾部 ...