[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 ...
随机推荐
- webRTC中语音降噪模块ANS细节详解(一)
ANS(adaptive noise suppression) 是webRTC中音频相关的核心模块之一,为众多公司所使用.从2015年开始,我在几个产品中使用了webRTC的3A(AEC/ANS/AG ...
- 高级爬虫面试题测试题 v1.3
Python Web高级爬虫工程师测试题 (请本文件发送到: SpiderTestQuestion@163.com 并附带简历) 1. 用yield写一个斐波那契数列的生成器函数. 2. 放一段scr ...
- 题解 Crash 的文明世界
题目传送门 题目大意 给出一个\(n\)个点的树,和常数\(k\),对于\(\forall i\in[1,n]\),求出: \[\sum_{j=1}^{n} \text{dist}(i,j)^k \] ...
- SpringBoot整合JDBC-调用数据库
SpringData 对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理. Sprin ...
- perl打开读取文件(open)
在Perl中可以用open或者sysopen函数来打开文件进行操作,这两个函数都需要通过一个文件句柄(即文件指针)来对文件进行读写定位等操作.下面以open函数为例:1:读:open(文件句柄,&qu ...
- C程序内存布局
作为计算机专业的来说,程序入门基本都是从C语言开始的,了解C程序中的内存布局,对我们了解整个程序运行,分析程序出错原因,会起到事半功倍的作用 . C程序的内存布局包含五个段,分别是STACK(栈段), ...
- part1 软件测试基础知识面试题(含答案)
1.你的测试职业发展是什么? 测试经验越多,测试能力越高.所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去.而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求 ...
- F1西班牙大奖赛-加泰罗尼亚赛道地图及简介
背景 银石双赛结束,第二轮三连赛的最后一场将转战西班牙,第50届F1西班牙大奖赛将于本周末(正赛2020-08-15)在加泰罗尼亚赛道上演. 作为近年来F1承办季前测试的赛道,所有人都对这里再熟悉不过 ...
- Golang通脉之错误处理
在实际工程项目中,总是通过程序的错误信息快速定位问题,但是又不希望错误处理代码写的冗余而又啰嗦.Go语言没有提供像Java.C#语言中的try...catch异常处理方式,而是通过函数返回值逐层往上抛 ...
- the Agiles Scrum Meeting 10
会议时间:2020.4.18 20:00 1.每个人的工作 今天已完成的工作 个人结对项目增量开发组:完成自动创建仓库功能 issues:增量组:准备评测机制,增加仓库自动创建和管理 团队项目增量开发 ...