【BJOI2017】魔法咒语

AI提示词实战:用EARS语法5步搞定产品需求拆解(附完整案例) 本文详细介绍了如何运用EARS语法将模糊的产品需求进行原子化拆解,转化为清晰、可执行的结构化指令。通过一个完整的自由职业者项目管理工具案例,演示了从原始需求分析到构建增强AI提示词的五步实战流程,帮助产品经理和技术人员实现高效、精准的需求传达与协作。 阅读详情

时间限制 : 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;
}
Metal 一、初识 Metal 及其语言规范 游戏开发者的新的技术平台,该技术能够为3D图像提高 10 倍的渲染性能。苹果2018年推出 Metal,在此之前一直使用OpenGL ES。1图形渲染;2高并发计算。苹果文档给出的 Metal 优化:CPU 低消耗、GPU 高利用、连续处理器并行、有效的资源利用Metal 官方文档。 阅读详情

相关推荐

Python爬虫实战:5分钟搞定东方财富A股数据抓取(附完整代码)

本文提供了一套基于Python的A股数据自动化采集与分析系统构建方案。文章详细解析了如何通过稳健的爬虫框架从东方财富等公开数据源高效抓取A股数据,并设计数据库进行自动化存储与管理,特别适合量化研究和数据分析场景。

weixin_29062963的博客 4429

BJOI染色

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

Fire Dancer 747

Unity游戏Mono注入实战:从反编译到功能扩展

本文详细介绍了Unity游戏Mono注入的完整实战流程,从使用dnSpy反编译游戏核心逻辑,到编写自定义C#功能DLL,再到利用SharpMonoInjector进行动态注入。文章深入讲解了如何通过Harmony库拦截修改游戏方法,并介绍了使用MelonLoader框架和UnityExplorer进行高级模组开发与调试,最终通过一个游戏对象透视(ESP)案例演示了功能扩展的实现。

weixin_29018335的博客 458

【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

阿里云学生机2核4G,30分钟搞定DNF台服联机(CentOS 7.6保姆级教程)

本文提供阿里云学生机2核4G搭建DNF台服联机的详细教程,涵盖服务器选购、网络配置、服务端部署及客户端联机设置。通过CentOS 7.6系统优化和端口配置,30分钟内即可完成搭建,适合学生和技术爱好者低成本实现游戏联机体验。

weixin_42537919的博客 359

TIBCO Jaspersoft Studio报表开发 使用教程-进阶版

本文学习内容容器定制二级目录三级目录 容器定制 二级目录 三级目录

吉哲的博客 7521

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

基于STM32L4XX、HAL库的E180-ZG120B ZigBee模块驱动程序设计

/ 频率: 470MHz, SF7, BW125kHz, CR4/5, 功率14dBm。// 检查是否收到完整响应(根据实际情况调整)// 每5秒发送一次。PB0 <---> AUX (可选,用于状态检测)// 实际发送命令可能需要根据模块AT指令集调整。PC13 <---> RESET (可选)// 处理接收到的数据。// 缓冲区满,从头开始。// 其他必要的HAL库初始化代码...// 初始化E180模块。// 启动UART接收。// 如果需要等待响应。// 配置LoRa参数。

zhusl6688的博客 380

[BJOI2018]求和

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

Young_Zn_Cu 300

用Obsidian搭建个人知识库:AI时代如何构建你的第二大脑

AI 时代,真正有价值的不只是获取知识,而是沉淀属于自己的知识体系。本文从 Obsidian 安装、目录设计、双向链接、插件推荐到 AI 联动、多端同步,手把手教你打造高效、可持续进化的个人知识库,让知识真正为你所用。🧠

XiaoqiangClub的博客 468

10万+字超硬核 机器学习 笔记(面试八股)

10w字总结面试中可能用到的机器学习八股和常用算法,包括感知机(Perceptron)、多层感知机(MLP, Multi-Layer Perceptron)、支持向量机(SVM, Support Vector Machine)、K 最近邻(KNN, K-Nearest Neighbors)、朴素贝叶斯(Naive Bayes)、决策树(Decision Tree)、随机森林(Random Forest)、Bagging、Boosting、GBDT、XGBoos、LightGBM等。

haopinglianlian的博客 4658

BZOJ4859 BJOI2017机动训练

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

Rayment的博客 723

Python从0到100(十九):Python标准库初探

哈希函数又称哈希算法或散列函数,是一种为已有的数据创建“数字指纹”(哈希摘要)的方法。哈希函数把数据压缩成摘要,对于相同的输入,哈希函数可以生成相同的摘要(数字指纹),需要注意的是这个过程并不可逆(不能通过摘要计算出输入的内容)。举一个简单的例子,用户注册时我们希望在数据库中保存用户的密码,很显然我们不能将用户密码直接保存在数据库中,这样可能会导致用户隐私的泄露,所以在数据库中保存用户密码时,通常都会将密码的“指纹”保存起来,用户登录时通过哈希函数计算密码的“指纹”再进行匹配来判断用户登录是否成功。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 5004

[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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

bzoj4861 / P3715 [BJOI2017]魔法咒语

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

dingqiongliang0363的博客 254

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

P3715 [BJOI2017]魔法咒语

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

weixin_30847271的博客 236

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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、付费专栏及课程。

余额充值