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
分析下怎么写 首先,我们需要一个输入框,可以手动的输入手机号码, 其次,很少有人愿意手动输入,那么我们需要提供一个按钮来给我们的用户选择自己电话本中的联系人(一次可以选择多个即群发) 然后,我们需要一 ...
随机推荐
- 由一道CTF pwn题深入理解libc2.26中的tcache机制
本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...
- 操作DOM -------JavaScrip
本文摘要:http://www.liaoxuefeng.com/ 经常用到. 由于HTML文档被浏览器解析后就是一棵DOM树,要改变HTML的结构,就需要通过JavaScript来操作DOM. 始终记 ...
- 如何使用工具进行C/C++的内存泄漏检测
系统编程中一个重要的方面就是有效地处理与内存相关的问题.你的工作越接近系统,你就需要面对越多的内存问题.有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦.所以,在实践中会用到很多工具来 ...
- 解决ndk编译lua时遇到 undefined reference to '__srget'的问题
今天用ndk r10d版本编译lua时,遇到几个错误,提示没有找到__srget 没有定义,于是看了国外的大神的解决方法, 是因为ndk在r10c之后的版本已经将getc函数屏蔽了,所以导致编译器找不 ...
- 2.3.3 zerosum 和为零
#include<bits/stdc++.h> using namespace std; ],a; ]={' ','+','-'}; void out() { ;i<a;i++) c ...
- 如何用eclipse运行导入的maven项目
1.配置jdk系统环境变量.找到安装的jdk的安装目录,新建系统环境变量,变量名为JAVA_HOME(作为一个引用),变量值为该路径. 找到Path,将%JAVA_HOME%/bin; 添加到变量值的 ...
- 一个batch的数据如何做反向传播
一个batch的数据如何做反向传播 对于一个batch内部的数据,更新权重我们是这样做的: 假如我们有三个数据,第一个数据我们更新一次参数,不过这个更新只是在我们脑子里,实际的参数没有变化,然后使用原 ...
- BFS:Nightmare(可返回路径)
解题心得: 1.point:关于可以返回路径的BFS的标记方法,并非是简单的0-1,而是可以用时间比较之后判断是否push. 2.queue创建的地点(初始化问题),在全局中创建queue在一次调用B ...
- sql:where中多种状况简便写法
字段名:Bran,block,are ,store 四个字段中存在值等于0或者不等于0,两种情况.where中如果用if等条件判断会有16中组合,如果采用where中的条件就避免了这个情况. decl ...
- Struts之上传
上传的jsp写法: <tr> <td width="50%" align="left">软件上传: <input type=&qu ...