• [hdu7081]Pty loves book


    建立ac自动机,令$S_{x}$为以根到$x$的路径所构成的字符串以及$L_{x}=|S_{x}|,W_{x}=sum_{1le ile m,t_{i}为S_{x}的后缀}w_{i}$,那么不难得到有$W_{x}=sum_{1le ile 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}{pchoose 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
    ",ans);
    83     }
    84     return 0;
    85 } 
    View Code
  • 相关阅读:
    新概念第二册(1)--英语口语听力课1
    外企面试课程(一)---熟悉常见的缩略词
    公司 邮件 翻译 培训 长难句 结课
    workflow
    公司 邮件 翻译 培训 长难句 20
    公司 邮件 翻译 培训 长难句 19
    Engineering Management
    公司 邮件 翻译 培训 长难句 18
    公司 邮件 翻译 培训 长难句 17
    第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/15185644.html
Copyright © 2020-2023  润新知