[hdu7081]Pty loves book
建立ac自动机,令$S_{x}$为以根到$x$的路径所构成的字符串以及$L_{x}=|S_{x}|,W_{x}=\sum_{1\le i\le m,t_{i}为S_{x}的后缀}w_{i}$,那么不难得到有$W_{x}=\sum_{1\le i\le m,t_{i}=S_{x}}w_{i}+W_{fail_{x}}$,即可预处理出$W$
进一步的,令$pos(s)$为在其中查询$s$得到的最终节点,则有$f(s)=\sum_{i=1}^{|s|}W_{pos(s[1,i])}$
接下来,考虑再求出$F_{x}=\sum_{i=1}^{L_{x}}f(S_{x}[i,L_{x}])^{5}$,对于其中$i>L_{x}-L_{fail_{x}}$的部分即为$F_{fail_{x}}$,而剩下的部分即为$\sum_{i=1}^{L_{x}-L_{fail_{x}}}f(S_{x}[i,L_{x}])^{5}$,将其记为$G_{x}$
关于$G_{x}$,显然$f(S_{x}[i,L_{x}])=f(S_{x}[i,L_{x}))+W_{pos(S_{x}[i,L_{x}])}$,并特判$i=1$时的贡献(即$x$到根路径$W$之和的5次方),对于其他情况后者即$W_{fail_{x}}$
关于前者,即从$x$的父亲$fa$开始不断走到$fail_{fa}$直至$fail_{x}$的父亲为止的$G_{fa}$之和,但注意其中还多算了$i=1$时的答案,即去掉$f(S_{x}[1,L_{x}))+W_{fail_{x}}$
另外由于是5次方,需要求出$G_{x,p}=\sum_{i=1}^{L_{x}-L_{fail_{x}}}f(S_{x}[i,L_{x}])^{p}$,展开后即有
$$
G_{x,p}=\sum_{i=0}^{p}{p\choose i}W_{fail_{x}}^{i}\sum_{fa}G_{fa,p-i}+(\sum_{y在x到根路径上}W_{y})^{p}-(\sum_{y在x的父亲到根路径上}W_{x}+W_{fail_{x}})^{p}
$$
最终,不妨初始将$s$也加入自动机中,那么答案即$pos(s)$到根路径的$F$之和,可以计算
总复杂度为$o(5^{2}|s|)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 #define mod 1000000007
5 #define ll long long
6 queue<int>q;
7 int V,t,n,m,x,ans,C[6][6],fail[N],w[N],sum[N],G[N][6],F[N],ch[N][26];
8 char s[N];
9 int New(){
10 int k=++V;
11 w[k]=0;
12 memset(G[k],0,sizeof(G[k]));
13 memset(ch[k],0,sizeof(ch[k]));
14 return k;
15 }
16 void add(int x){
17 int k=1,l=strlen(s);
18 for(int i=0;i<l;i++){
19 if (!ch[k][s[i]-'a'])ch[k][s[i]-'a']=New();
20 k=ch[k][s[i]-'a'];
21 }
22 w[k]=(w[k]+x)%mod;
23 }
24 int main(){
25 for(int i=0;i<6;i++){
26 C[i][0]=C[i][i]=1;
27 for(int j=1;j<i;j++)C[i][j]=C[i-1][j-1]+C[i-1][j];
28 }
29 scanf("%d",&t);
30 while (t--){
31 scanf("%s%d",s,&m);
32 V=ans=0,n=strlen(s);
33 New(),add(0);
34 for(int i=1;i<=m;i++){
35 scanf("%s%d",s,&x);
36 add(x);
37 }
38 fail[1]=1;
39 q.push(1);
40 while (!q.empty()){
41 int k=q.front();
42 q.pop();
43 for(int i=0;i<26;i++)
44 if (ch[k][i]){
45 if (k==1)x=1;
46 else{
47 x=fail[k];
48 while ((x>1)&&(!ch[x][i]))x=fail[x];
49 if (ch[x][i])x=ch[x][i];
50 }
51 fail[ch[k][i]]=x;
52 w[ch[k][i]]=(w[ch[k][i]]+w[x])%mod;
53 sum[ch[k][i]]=(sum[k]+w[ch[k][i]])%mod;
54 q.push(ch[k][i]);
55 }
56 }
57 q.push(1);
58 while (!q.empty()){
59 int k=q.front();
60 q.pop();
61 for(int i=0;i<26;i++)
62 if (ch[k][i]){
63 x=ch[k][i];
64 int s1=1,s2=1;
65 for(int p=1;p<6;p++){
66 s1=(ll)s1*sum[x]%mod,s2=(ll)s2*(sum[k]+w[fail[x]])%mod;
67 G[x][p]=(s1-s2+mod)%mod;
68 }
69 if (fail[x]==1)G[x][0]=1;
70 for(int p=0;p<6;p++){
71 int s=1;
72 for(int j=0;j<=p;j++){
73 for(int fa=k;(fa!=1)&&(ch[fa][i]!=fail[x]);fa=fail[fa])G[x][p]=(G[x][p]+(ll)C[p][j]*s%mod*G[fa][p-j])%mod;
74 s=(ll)s*w[fail[x]]%mod;
75 }
76 }
77 F[x]=(F[fail[x]]+G[x][5])%mod;
78 q.push(x);
79 }
80 }
81 for(int i=1;i<=n;i++)ans=(ans+F[i+1])%mod;
82 printf("%d\n",ans);
83 }
84 return 0;
85 }
[hdu7081]Pty loves book的更多相关文章
- [hdu7085]Pty loves SegmentTree
简单分析,不难得到以下转移--$$f_{n}=\begin{cases}1&(n=1)\\B\sum_{i=1}^{n-1}f_{i}f_{n-i}&(n\le k)\\B\sum_{ ...
- [hdu7082]Pty loves lcm
先将问题差分,即仅考虑上限$R$(和$L-1$) 注意到$f(x,y)$增长是较快的,对其分类讨论: 1.若$y\ge x+2$,此时满足$f(x,y)\le 10^{18}$的$(x,y)$只有约$ ...
- Microsoft Loves Linux
微软新任CEO纳德拉提出的“Microsoft Loves Linux”,并且微软宣布.NET框架的开源,近期Microsoft不但宣布了Linux平台的SQL Server,还宣布了Microsof ...
- 5806 NanoApe Loves Sequence Ⅱ(尺取法)
传送门 NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K ...
- 5805 NanoApe Loves Sequence(想法题)
传送门 NanoApe Loves Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 K ( ...
- CF444C. DZY Loves Colors[线段树 区间]
C. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces444C DZY Loves Colors(线段树)
题目 Source http://codeforces.com/problemset/problem/444/C Description DZY loves colors, and he enjoys ...
- CodeForces445A DZY Loves Chessboard
A. DZY Loves Chessboard time limit per test 1 second memory limit per test 256 megabytes input stand ...
- BestCoder Round #90 A.Kblack loves flag(随机数生成种子)
A.Kblack loves flag [题目链接]A.Kblack loves flag [题目类型]水题 &题意: kblack喜欢旗帜(flag),他的口袋里有无穷无尽的旗帜. 某天,k ...
随机推荐
- 设置 SSH 命令行空闲保持会话
楔子 使用 Mac 或 Linux 原生的命令行 ssh user@ip 方式连接 Linux 闲时会自动断开终端卡死. 为解决这个问题,查了到篇博客翻译下关键步骤记录下来.解决方式可以分服务端设置和 ...
- JS中call,apply,bind的区别
1.关于this对象的指向,请看如下代码 var name = 'jack'; var age = 18; var obj = { name:'mary', objAge:this.age, myFu ...
- t-SNE算法
t-SNE 算法 前言 t-SNE(t-distributed stochastic neighbor embedding) 是用于降维的一种机器学习算法,由 Laurens van der Maat ...
- 洛谷3233 HNOI2014(虚树+dp)
膜拜一发\(mts\_246,forever\_shi\) 这两位爷是真的无敌! 首先来看这个题,一看题目的数据范围和"关键点"字眼,我们就能得知这是一道虚树题 那就先一如既往的建 ...
- CTF入门记录(1
(https://ctf-wiki.org) 00 基础了解 CTF简介 (wolai.com) 00-1 CTF题目类型 Web 大部分情况下和网.Web.HTTP等相关技能有关. Web攻防的一些 ...
- 2020.10.16--vj个人赛补题
D - Drinks Choosing Old timers of Summer Informatics School can remember previous camps in which eac ...
- Windows 10下CUDA及cuDNN的安装 —— Pytorch
Windows 10下CUDA及cuDNN的安装 CUDA简介与下载地址 CUDA(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台. CU ...
- [JUC-5]ConcurrentHashMap源码分析JDK8
在学习之前,最好先了解下如下知识: 1.ReentrantLock的实现和原理. 2.Synchronized的实现和原理. 3.硬件对并发支持的CAS操作及JVM中Unsafe对CAS的实现. 4. ...
- C程序内存布局
作为计算机专业的来说,程序入门基本都是从C语言开始的,了解C程序中的内存布局,对我们了解整个程序运行,分析程序出错原因,会起到事半功倍的作用 . C程序的内存布局包含五个段,分别是STACK(栈段), ...
- NodeJs安装与环境配置
https://blog.csdn.net/qq_43285335/article/details/90696126 https://www.cnblogs.com/liuqiyun/p/813390 ...