[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 ...
随机推荐
- 地形鞍部的提取(ArcPy实现)
1.背景 相邻两山头之间呈马鞍形的低凹部分称为鞍部.鞍部点是重要的地形控制点,它和山顶点.山谷点及山脊线.山谷线等构成地形特征点线,对地形具有很强的控制作用.因此,因此,对这些地形特征点.线的分析研究 ...
- GoLang设计模式10 - 中介者模式
中介者模式是一种行为型设计模式.在中介者模式中创建了一个中介对象来负责不同类间的通信.因为这些类不需要直接交互,所以也就能避免它们之间的直接依赖,实现解耦的效果. 中介者模式的一个典型案例是老式小火车 ...
- Eureka使用总结
关于Eureka: 提供基于 REST的服务,在集群中主要用于服务管理.使用该框架,可以将业务组件注册到Eureka容器中,这些组件可进行集群部署,Eureka主要维护这些服务的列表并自动检查他们的状 ...
- 用 @Value("${xxxx}")注解从配置文件读取值的用法
1. 用法: 从配置properties文件中读取init.password 的值. @Value("${init.password}") private String init ...
- PTA习题6-8 统计一行文本的单词个数 (15分)
参考<c和指针>里面运用strtok函数打印空白标记符(如\n,\t)的程序改写而成的代码 在之前我自己写了一个60行的链表版本的统计程序 相比之下这个strtok函数的程序要简洁明了的多 ...
- g++ 常用命令
g++ --help
- tcl概述
tcl,全名tool command language,是一种通用的工具语言. 1)每个命令之间,通过换行符或者分号隔开: 2)tcl的每个命令包含一个或者多个单词,默认第一个单词表示命令,第二个单词 ...
- DOS命令和快捷键
- VS Code Remote SSH设置
本文翻译自:5 Steps: Setup VS Code for Remote Development via SSH from Windows to Linux system 5个步骤:设置VS代码 ...
- JVM:GC Roots
JVM:GC Roots 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 JVM 垃圾回收的时候如何确定垃圾 什么是垃圾 简单来说就是内存中已经不再被使用的空间就 ...