【题解】Luogu P4052[JSOI2007]文本生成器 AC自动机

AC自动机上DP

f[i][j]表示节点j,串长为i

当一个串的尾节点被标红或其fail指针指向的被标红,都是可读的

用总的减去不可读的即为答案

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define MOD (10007)
#define  N  (10005)
using namespace std;

int Son[N][26],End[N],Fail[N];
int n,m,sz,f[105][N],ans;
char s[N];
queue<int>q;

void Insert(char s[])
{
    int now=0,len=strlen(s);
    for (int i=0; i<len; ++i)
    {
        int x=s[i]-‘A‘;
        if (!Son[now][x]) Son[now][x]=++sz;
        now=Son[now][x];
    }
    End[now]|=1;
}

void Build_Fail()
{
    for (int i=0; i<26; ++i)
        if (Son[0][i])
            q.push(Son[0][i]);
    while (!q.empty())
    {
        int now=q.front();
        q.pop();
        for (int i=0; i<26; ++i)
        {
            if (!Son[now][i])
            {
                Son[now][i]=Son[Fail[now]][i];
                continue;
            }
            End[Son[now][i]]|=End[Son[Fail[now]][i]];
            Fail[Son[now][i]]=Son[Fail[now]][i];
            q.push(Son[now][i]);
        }

    }
}

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1; i<=n; ++i)
        scanf("%s",s),Insert(s);
    Build_Fail();
    f[0][0]=1;
    for (int i=1; i<=m; ++i)
        for (int j=0; j<=sz; ++j)
            for (int k=0; k<26; ++k)
                if (!End[Son[j][k]])
                    (f[i][Son[j][k]]+=f[i-1][j])%=MOD;
    for (int i=0; i<=sz; ++i)
        (ans+=f[m][i])%=MOD;
    int sum=1;
    for (int i=1; i<=m; ++i)
        sum=sum*26%MOD;
    printf("%d\n",(sum-ans+MOD)%MOD);
}

原文地址:https://www.cnblogs.com/gengyf/p/11145875.html

时间: 2024-10-28 22:01:20

【题解】Luogu P4052[JSOI2007]文本生成器 AC自动机的相关文章

【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划

[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章-- 也就是说,生成的文章中每个字节都是完全随机的.如果一篇文章中至少包含使用者们了解的一个单词,那么我们说这篇文章是可读的(我们称文章a包含单词b,当且仅当单词b是文章a的子串).但是,即使按照这样的标准

BZOJ 1030: [JSOI2007]文本生成器( AC自动机 + dp )

之前一直没调出来T^T...早上刷牙时无意中就想出错在哪里了... 对全部单词建AC自动机, 然后在自动机上跑dp, dp(i, j)表示匹配到了第i个字符, 在自动机上的j结点的方案数, 然后枚举A~Z进行转移. -------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; #define idx(c) ((c) -

[BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 &amp; dp)

Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章—— 也就是说,生成的文章中每个字节都是完全随机的.如果一篇文章中至少包含使用者们了解的一个单词,那么我们说这篇文章是可读的(我们称文章a包含单词b,当且仅当单词b是文章a的子串).但是,即使按照这样的标准,使用者现在使用的GW文本生成器v6版所生成的文章也是几乎完全

bzoj1030 [JSOI2007]文本生成器——AC自动机+DP

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求至少有一个单词的文本串不太好求,所以转化成求所有情况减去没有一个单词的文本串: 没有一个单词的文本串可以用AC自动机+DP求,设 f[i][j] 表示文本串长度为 i ,当前 Trie 树上节点为 j 的方案数: 则 f[i][j] 可以转到仍然不包含单词的它的儿子的方案数中,同时文本串长度+1: 所以需要在 getfail 时把单词结尾的属性也转移一下,因为 fail 是单词结尾

[JSOI2007]文本生成器 (AC自动机+dp)

Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文 章—— 也就是说,生成的文章中每个字节都是完全随机的.如果一篇文章中至少包含使用者们了解的一个单词, 那么我们说这篇文章是可读的(我们称文章a包含单词b,当且仅当单词b是文章a的子串).但是,即使按照这样的 标准,使用者现在使用的GW文本生成器v6版所生成的文章也是

[JSOI2007]文本生成器 [AC自动机,dp]

时刻要记住正难则反,可以知道总数是 \(26^m\),我们可以减掉不合法的. AC自动机上面dp,不合法的显然就是没有出现任意的一个串,根据rainy的教导 单词 \(b,bce,abcd\) 的 ACAM 然后 \(dp\) 就好了,由于点数不超过 \(n*m \leq 6000\),然后你每一位枚举复杂度是 \(m^2n\) 的 可以通过本题 // powered by c++11 // by Isaunoya #include <bits/stdc++.h> #define rep(i,

P4052 [JSOI2007]文本生成器

P4052 [JSOI2007]文本生成器 AC自动机+dp 优秀题解传送门 设f[ i ][ j ]表示串的长度为 i ,当前在 j 点时不可识别的串的方案数 最后用总方案数减去不可识别方案数就是答案了 因为题解写的很好所以我就只在代码中加点注释了(逃 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int mo

[JSOI2007][BZOJ1030] 文本生成器|AC自动机|动态规划

1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2609  Solved: 1074[Submit][Status][Discuss] Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章—— 也就是说,生成的文章中每个字节都是完

【BZOJ-1030】文本生成器 AC自动机 + DP

1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3253  Solved: 1330[Submit][Status][Discuss] Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章—— 也就是说,生成的文章中每个字节都是完