【BJOI2017】魔法咒语

ENVI基于Landsat影像构建郑州市2000-2019年遥感生态指数RSEI 本文基于landsat5、landsat7、landsat8三种传感器的影像,使用ENVI软件构建郑州市2000-2019年遥感生态指数RSEI。内含ENVI详细操作、使用的公式以及构建结果。 阅读详情

时间限制 : 1000 MS 空间限制 : 131072 KB

问题描述

Chandra 是一个魔法天才。
从一岁时接受火之教会洗礼之后,Chandra 就显示出对火元素无与伦比的亲和力,轻而易举地学会种种晦涩难解的法术。这也多亏 Chandra有着常人难以企及的语言天赋,让她能轻松流利地说出咒语中那些极其拗口的魔法词汇。

直到十四岁,开始学习威力强大的禁咒法术时,Chandra 才遇到了障碍。

根据火之魔法规则,禁咒的构成单位是 N 个基本词汇。施法时只要凝聚精神力,说出一段用这些词语组成的长度恰好等于 L 的语言,就能释放威力超乎想象的火法术。过去的魔法师们总结了几种表达起来最连贯的组合方式,方便施法者以最快语速完成法术。

但具有魔法和语言双重天才的 Chandra不满足于这几种流传下来的禁咒,因为她可以毫无困难地说出普通人几乎不可能表达的禁咒语句。然而,在实际施法时,Chandra 发现有些自创禁咒念出后不但没有预期效果,反而会使自己的精神力迅速枯竭,十分难受。

这个问题令 Chandra 万分不解。她大量阅读典籍,到处走访魔法学者,并且不顾精神折磨一次又一次尝试新咒语,希望找出问题的答案。

很多年过去了,在一次远古遗迹探险中,Chandra意外闯进了火之神艾利克斯的不知名神殿。根据岩土特征分析,神殿应该有上万年的历史,这是极其罕见的。Chandra 小心翼翼地四处探索,沿着魔力流动来到一间密室。她看见密室中央悬浮着一本书籍。在魔法保护下书籍状况完好。精通上古语言的 Chandra 读过此书,终于解开了多年的困惑。

禁咒法术之所以威力强大,是因为咒语借用了火之神艾利克斯的神力。这本书里记载了艾利克斯生平忌讳的 M 个词语,比如情敌的名字、讨厌的植物等等。使用禁咒法术时,如果语言中含有任何忌讳词语,就会触怒神力而失效,施法者也一并遭受惩罚。

例如,若 ”banana” 是唯一的忌讳词语,“an”、”ban”、”analysis” 是基本词汇,禁咒长度须是11,则“bananalysis” 是无效法术,”analysisban”、”anbanbanban”是两个有效法术。注意:一个基本词汇在禁咒法术中可以出现零次、一次或多次;只要组成方式不同就认为是不同的禁咒法术,即使书写形式相同。

谜题破解,Chandra 心情大好。她决定计算一共有多少种有效的禁咒法术。

由于答案可能很大,你只需要输出答案模 1,000,000,007 的结果。

输入格式

第一行,三个正整数 N, M, L。
接下来 N 行,每行一个只含小写英文字母的字符串,表示一个基本词汇。
接下来 M 行,每行一个只含小写英文字母的字符串,表示一个忌讳词语。

输出格式

仅一行,一个整数,表示答案(模 10^9+7)。

样例输入 1

4 2 10
boom
oo
ooh
bang
ob
mo

样例输出 1

14

样例输入 2

3 1 3
a
ab
aba
aaa

样例输出 2

3

样例输入 3

3 1 14
ban
an
analysis
banana

样例输出 3

15

提示

样例解释 1】

有效的禁咒法术共有 14 种:boom/bang/oo,oo/oo/oo/oo/oo,oo/oo/ooh/ooh,

oo/ooh/oo/ooh,oo/ooh/ooh/oo,ooh/oo/oo/ooh,ooh/oo/ooh/oo,

ooh/ooh/boom,ooh/ooh/oo/oo,ooh/ooh/bang,ooh/bang/ooh,

bang/oo/oo/oo,bang/ooh/ooh,bang/bang/oo。

【样例解释 2】

有效的禁咒法术有 a/ab, ab/a, aba 共三种。注意,ab/a 和 aba 算成两种不同的禁咒法术。

【数据规模与约定】

本题一共有 10 个测试点。

下表是每个测试点的数据规模和约定:
这里写图片描述

题解

题目描述有点长,看起来比较吓人,但题意还是比较简单的。
对于前60%的数据,直接对忌讳词语建AC自动机,然后在机子上跑记忆化搜索或递推就可以了。
本题主要难点在后40%,尤其是最后20%的数据上。我们可以把AC自动机看成一张图,在字符串后接上某基本词语就相当于从图上一点走一条路径到达另一点。观察数据的特殊性——基本词语长度为1或2且LL很大。如果所有基本词语长度都只有1,那么在图上的转移路径就只会经过一条边,题目问题就转化为了已知图上两点间有一条边,求从起点(AC自动机根节点)出发走L条边后在任意点停下的方案数——经典的矩阵乘法问题!要处理禁忌词汇,只需提前预处理出所有路径的起止点,当终点为某禁忌词汇的末尾时,删去该路径即可。对于基本词语长度为2的情况,我们需要构造虚拟点在原路径的起止点间做中转,相当于起点到终点需走两步(经过两条边),注意最后计算结果时不能包含虚拟点!
为什么前60%的数据不能用后40%的方法?基础词汇太长->虚拟点太多->时空复杂度爆炸!
详见代码……

代码

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
typedef ll arr[205][205];
const ll mod=1e9+7;
ll n,m,l,tot,val[105],fail[105],trie[105][30],G[105][55];
ll N,ans,f[105][105];
arr I,A;
char c[55][105],tab[105];
queue<ll> q;
namespace ACAM
{
    void Insert()
    {
        ll p=0,len=strlen(tab+1);
        for(ll i=1;i<=len;i++)
        {
            ll t=tab[i]-'a';
            if(!trie[p][t]) trie[p][t]=++tot;
            p=trie[p][t];
        }
        val[p]++;
    }
    void Getfail()
    {
        for(ll i=0;i<26;i++)
            if(trie[0][i]) q.push(trie[0][i]);
        while(!q.empty())
        {
            ll x=q.front();q.pop();
            for(ll i=0;i<26;i++)
            {
                ll son=trie[x][i];
                if(!son)
                {
                    trie[x][i]=trie[fail[x]][i];
                    continue;
                }
                q.push(son);
                ll y=fail[x];
                while(y&&!trie[y][i]) y=fail[y];
                fail[son]=trie[y][i],val[son]|=val[fail[son]];
            }
        }
    }
    ll Goto(ll p,ll x)
    {
        ll len=strlen(c[x]+1);
        for(ll i=1;i<=len;i++)
            if(!val[trie[p][c[x][i]-'a']]) p=trie[p][c[x][i]-'a'];
            else return -1;
        return p;
    }
    ll DFS(ll p,ll step)
    {
        if(step==l) return 1;
        if(~f[p][step]) return f[p][step];
        f[p][step]=0;
        for(ll i=1;i<=n;i++)
            if((~G[p][i])&&step+strlen(c[i]+1)<=l)
                f[p][step]=(f[p][step]+DFS(G[p][i],step+strlen(c[i]+1)))%mod;
        return f[p][step];
    }
}
namespace matrix
{
    void mul(arr y,arr x)
    {
        arr z;
        memset(z,0,sizeof(z));
        for(ll i=0;i<=N;i++)
            for(ll j=0;j<=N;j++)
                for(ll k=0;k<=N;k++)
                    z[i][j]=(z[i][j]+y[i][k]*x[k][j]%mod)%mod;
        memcpy(y,z,sizeof(z));
    }
    void ksm(ll b)
    {
        for(ll i=0;i<=N;i++) I[i][i]=1;
        while(b)
        {
            if(b&1) mul(I,A);
            b>>=1;
            mul(A,A);
        }
    }
}
int main()
{
    scanf("%lld%lld%lld",&n,&m,&l);
    for(ll i=1;i<=n;i++) scanf("%s",c[i]+1);
    for(ll i=1;i<=m;i++) scanf("%s",tab+1),ACAM::Insert();
    ACAM::Getfail();
    for(ll i=0;i<=tot;i++)
        for(ll j=1;j<=n;j++) G[i][j]=ACAM::Goto(i,j);
    if(l<=100)
    {
        memset(f,-1,sizeof(f));
        ACAM::DFS(0,0);
        printf("%lld\n",f[0][0]);
    }
    else
    {
        N=2*tot+1;
        for(ll i=0;i<=tot;A[i][i+tot+1]++,i++)
            for(ll j=1;j<=n;j++)
                if(~G[i][j])
                    if(strlen(c[j]+1)==1) A[i][G[i][j]]++;
                    else A[i+tot+1][G[i][j]]++;
        matrix::ksm(l);
        for(ll i=0;i<=tot;i++) ans=(ans+I[0][i])%mod;
        printf("%lld\n",ans);
    }
    return 0;
}
基于 Verilog 的经典数字电路设计(10)三态门 三态门(Triple-State Gate)亦称 “三态输出门”、“三态门输出电路”,是一种重要的总线接口电路,具有高电平、低电平和高阻抗三种输出状态的门电路,不过我们通常在设计中比较少见。   三态指其输出既可以是一般二值逻辑电路,即正常的高电平(逻辑 1)或低电平(逻辑 0),又可以保持特有的高阻抗状态,高阻态相当于隔断状态(电阻很大,相当于开路)。 阅读详情

相关推荐

MOOS-ivp 实验一 MOOS软件的安装与执行

MOOS-ivp实验一 实验一步骤总结 文章目录MOOS-ivp实验一前言一、实验一1.下载软件2.安装必要的插件3.安装后检查4.路径添加5.执行示例文件总结 前言 在moos学习过程中,我觉得最好把学习的每一步骤都总结一下,方便日后进行回顾。moos官网设置了十八个实验,涉及到了moos的各个方面,完成这些实验也是moos入门的好办法。 一、实验一 实验一主要内容仅仅是软件的安装,仅仅这一步就花费了我接近两天的时间。主要问题发生在linux系统的配置问题上。 1.下载软件 svn co https:

weixin_44151170的博客 6669

BJOI染色

我还是自己脑补了很久才理解。 首先二分图全部相同即可。 然后可以不停地剔除那些du为1的点,这些点对答案没有任何影响。 然后我们发现我们对于一个环我们可以用三个点来直接把剩下的部分染上相间的颜色。 一个推广是如果两个偶环有公共部分,且这两个环的每个环自己独有的部分长度至少为2的话,我们一定可以构造出一个合法解来cha掉。 单独考虑每一个边双。 这个结论的推论就是一个点如果度数超过3 那么一定可以找...

Fire Dancer 747

20个闭环渗透测试项目:从漏洞发现到简历突围

渗透测试不仅是工具使用,更是对系统设计缺陷与实现偏差的深度推演。理解OWASP Top 10、Burp Suite等基础能力只是起点,真正具备工程价值的是能复现、可验证、可协作的完整攻击链。本文聚焦真实业务场景下的SSRF协议绕过、JWT签名机制缺陷、Redis未授权利用、Kong网关配置风险及etcd存储结构分析等核心热词,揭示漏洞本质在于架构决策与配置偏差的叠加态。适用于红队实战、甲方安全建设与乙方渗透审计等多类岗位,帮助从业者将技术动作升维为技术叙事。

weixin_32234493的博客 414

【BJOI】【欧拉函数】Euler

题目大意 给你一个数y要求输出一个满足φ(x)=y的最小的x,有T组询问。 y<=1012 1<=T<=2 解题思路 求φ(x)时有一个众所周知的公式是φ(x)=x∗Πpi−1pi(pi为x的所有质因子),也就是说这我们可以得到等式 φ(x)=y x∗Πpi−1pi=y (等式一) x...

weixin_30955341的博客 152

DEM数据下载,拼接,裁剪

目录: 1、数字高程模型(DEM)的数据下载 2、在ENVI里面进行拼接,生成SARscape标准格式的DEM数据3、在ArcGIS里面安装已有的矢量范文,进行掩膜裁剪 4、注意事项 数字高程模型的数据下载: 网址:http://dwtkns.com/srtm30m/ 1.对研究区域进行经纬度选择,然后进行选择下载即可 2.下载的数据是.hgt格式的,按照不同的需求进行转换,这里我是用于ENVI处理,且下载了四个,所有进行了拼接,拼接、格式转换如下 注:可能有时候需要登陆注册,点击下...

weixin_40874151的博客 2万+

使用ExcelJS向XLSX单元格居中插入图片

本文记录了使用ExcelJS库向XLSX单元格里居中写入图片的方法。本文内容包括:xlsx 文件格式;xlsx 图片定位的长度单位;使用nativeColOff和nativeRowOff进行定位,不要使用官网给的定位方式;添加图片到数据表的总体流程和样例代码;注意事项等。

weixin_43678000的博客 3456

BJOI 2014 大融合

题意 给 nnn 个点,一开始点与点之间没有边,mmm 次操作。 1.加边 2.查询 x,yx,yx,y 所在连通块经过 x→yx \to yx→y 的路径数。 数据保证加边 x,yx,yx,y 在不同连通块内。 题解 直接用 LCTLCTLCT 维护,然后查询 (x,y)(x,y)(x,y) 相当于把 x−yx - yx−y 这条边断掉,然后查询xxx 所在连通块点的的数量和 yyy 所在连通块点的数量,在把边连上。 所以要用 LCTLCTLCT 维护子树内信息: 记 xu[i]xu_[i]xu[​i]

qq_29361257的博客 754

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

shannanshouyin的博客 1327

[BJOI2018]求和

[BJOI2018]求和 先用倍增找出查询两点的LCALCALCA,如果LCALCALCA就是它们中的一个,那就直接在链上处理,注意whilewhilewhile它是怎么运行的,不要忘了加上最后LCA的贡献(做题的时候一定要想清楚再写,最好造几组特殊数据手玩)(要不是把题解扒了一篇下来对拍我估计还在WAWAWA)。如果LCALCALCA不是它们中的一个,那就分别拆成两条链来处理,也注意如何计算LCALCALCA的贡献。注意到kkk很小,直接暴力计算即可(然而我还非常智障的去问神仙有没有公式来算这个⋯\cdo

Young_Zn_Cu 300

Arcgis使用NDVI值遥感反演叶面积指数(LAI)

经验模型反演操作不难,主要是要多看文献,了解公式。本文中的公式我也不清楚是哪个作物的NDVI和LAI的关系(别人提供的),继续看文献整理吧。后续会在下面罗列更新一下主要公式。

所有专家都曾始于新手 8430

【大模型】DeepSeek 高级提示词技巧使用详解

DeepSeek 高级提示词技巧使用详解

congge 1万+

BZOJ4859 BJOI2017机动训练

Problem BZOJ Solution Salamander安利的一道题目。。思路很神的一道题目 对于平方,我们可以转化为选两条路径都为某个方案的方案数。注意到这个机动路径的定义,其实在确定了x,y之后,路径就是只能朝一个象限(虽然还包括了坐标轴)的方向走,那么我们不妨设g[x1][y1][x2][y2]表示第一条路径的方向向量为(x1,y1),(x2,y2)的方案数。然后我们可以记忆...

Rayment的博客 723

# 【WorkBuddy专栏33】工作空间,最大的WorkBuddy技巧——任务隔离、记忆分区与多项目管理实战

工作空间,最大的WorkBuddy技巧——任务隔离、记忆分区与多项目管理实战

AI人人懂 2131

[BJOI2017]魔法咒语

一、题目 点此看题 二、解法 观察数据范围,发现这道题需要对数据分类讨论。 0x01 l<=100 在AC\text{AC}AC自动机上dpdpdp,设f[i][j]f[i][j]f[i][j]为长度为iii,在自动机上匹配到了点jjj,暴力转移即可。 0x02 l<=1e8 且 基本词汇长度不超过2 这种数据最大的特点就是f[i]f[i]f[i]只可能从f[i−1],f[i−2]f[...

C202044zxy的博客 342

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

bzoj4861 / P3715 [BJOI2017]魔法咒语

P3715 [BJOI2017]魔法咒语 AC自动机+dp+矩阵乘法 常规思路是按基本串建立AC自动机 然鹅这题是按禁忌串建立AC自动机 对后缀是禁忌的点以及它的失配点做上标记$(a[i].ed)$,到时候不访问。 基本串转化为自动机上的边:设$p[j][i]$表示第$j$个节点加上第$i$个串会到的节点编号 在建好AC自动机后可以直接处理。 现在分类讨论(对,两份代码) ...

dingqiongliang0363的博客 254

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

P3715 [BJOI2017]魔法咒语

P3715 [BJOI2017]魔法咒语 用基本词汇组成\(L\)长度的单词,其中不能包含禁忌词汇 用禁忌词汇建强大的\(tire\)图 解决: 分类讨论,\(L<=100\)用普通dp暴力在\(tire\)图上用基本词汇跑,不能包含禁忌词汇 显然,\(L<=10^8\)肯定会超时的,注意到基本词汇的长度\(<=2\),矩阵优化一下 构造矩阵是一个难点,左边的矩阵两部分,我们要把...

weixin_30847271的博客 236

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

BJOI2017 魔法咒语

传送门 参考博客 l⩽100l \leqslant100l⩽100的dpdpdp很好做。 对于l⩽1e8l \leqslant 1e8l⩽1e8,由于有基本词汇长度不超过222,于是考虑如何构造这个矩阵。 ans[i][j]ans[i][j]ans[i][j]表示当前长度为iii,最后在自动机上jjj节点的方案数。 trans[l][i][j]trans[l][i][j]trans[l][i][j...

g21wcr的博客 281

【[BJOI2017]魔法咒语】

矩阵乘法+\(AC\)自动机 是道很不错的题了 首先是前六十分,就是一个\(AC\)自动机上的套路\(dp\),设\(dp[i][j]\)表示匹配出的长度为\(i\)在自动机上位置为\(j\)的方案数,转移的话就枚举下一个单词选择哪个放到自动机上一波匹配就好了 后面\(40\)分强行变成了另外一道题,\(L\)变成了\(1e8\),一看就是矩乘的复杂度了 但是单词的长度都非常小,于是转移...

weixin_30463341的博客 221

[BJOI2017]魔法咒语 --- AC自动机 + 矩阵优化

bzoj 4860 LOJ2180 洛谷P3175 [BJOI2017]魔法咒语 题目描述: Chandra 是一个魔法天才。 从一岁时接受火之教会洗礼之后,Chandra 就显示出对火元素无与伦比的亲和力,轻而易举地学会种种晦涩难解的法术。 这也多亏 Chandra 有着常人难以企及的语言天赋,让她能轻松流利地说出咒语中那些极其拗口的魔法词汇。 直到十四岁,开始学习威力强大的...

weixin_30402085的博客 162

[BJOI2017]魔法咒语(AC自动机+DP+矩阵快速幂)

AC自动机上跑dp蛮套路的

464

[BZOJ4861][BJOI2017]魔法咒语(AC自动机+矩阵优化DP)

4861: [Beijing2017]魔法咒语 Time Limit: 20 SecMemory Limit: 256 MBSubmit: 217Solved: 105[Submit][Status][Discuss] Description Chandra 是一个魔法天才。 从一岁时接受火之教会洗礼之后, Chandra 就显示出对火元素无与伦比的亲和力,轻...

weixin_30871701的博客 148

【BZOJ4861】【BJOI2017】—魔法咒语(AC自动机+矩阵快速幂优化dp)

传送门 当l≤100l\le 100l≤100时 显然的自动机上dpdpdp就完了 当l≤1e8l\le1e8l≤1e8时直接dpdpdp显然是不行的 但是发现基本串长度不大于二 考虑矩乘优化 a[i][j]a[i][j]a[i][j]表示有几个基本串使得在自动机上iii走到jjj 如果所有串长相同就可以直接快速幂了 但是串长有111有222 不同长度不好处理拼起来的情况 设A1A_1A1​表示长...

Stargazer的博客 286

BZOJ4861【BJOI2017】魔法咒语题解(AC自动机+DP+矩阵乘法)

题目:BZOJ4861. 题目大意:给定nnn个串SiS_iSi​和mmm个串TiT_iTi​,现在要用这SiS_iSi​个串(可重复使用)拼成一个长度为lll的串使得拼成的串所有TiT_iTi​均未出现,求方案数.注意只要组成方式不同就算不同的方案. 1≤n,m≤50,1≤∑∣Si∣,∑∣Ti∣≤100,1≤l≤1081\leq n,m\leq 50,1\leq \sum |S_i|,\sum ...

hzk_cpp的博客 542

省选 2017 杂题汇总

[ZJOI2017]仙人掌 发现可以把一个仙人掌看做所有环组成的图,如果不是环而是单个边,我们可以手动给它填一条边变成环 考虑一棵树怎么做? 就是在树上选若干条互不相交的链的方案数,考虑树形 dpdpdp fif_{i}fi​ 表示到 i 的子树的方案数,gig_igi​ 表示一个点有 i 条边相连,两两配对或者单身的方案数 gi=gi−1+(i−1)∗gi−2g_i=g_{i-1}+(i-1)*...

FSYo 的博客 209
上一篇: 【FJOI2016】所有公共子序列问题
下一篇: 【poj2417】Discrete Logging
StrideTG
博客等级 码龄9年 4粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值