P4569 [BJWC2011] 禁忌 题解
P4569 [BJWC2011] 禁忌 题解
前言:这道题补好了我的
题意:在字母集合
仔细看看挺套路的,因此不难想到
套路地,我们设
贪心地,字符串
具体地,进行第
如果你真的这样做,恭喜你可以获得
考虑到每个
具体地,设矩阵
那么我们只需要在自动机的遍历当中记录每一项可以由什么转移而来,记录这个系数在矩阵中就可以实现矩阵快速幂的转移了。
考虑到这个矩阵在初始形态下无意义,因此设为单位矩阵,在
最终答案
代码:
// keep on debuging !
#include <bits/stdc++.h>
#define N 105
using namespace std;
int n, len, alp;
long double tmp;
int trie[N][30];
int tot = 1; //由于中途会转移到根节点,不妨将根节点设为 1
bool vis[N];
void insert(char *s) {
int len = strlen(s), p = 1;
for (int i = 0; i < len; i++) {
int ch = s[i] - 'a';
if (!trie[p][ch])
trie[p][ch] = ++tot;
p = trie[p][ch];
}
vis[p] = true;
}
int fail[N];
queue<int>q;
void build() {
for (int i = 0; i < alp; i++)
trie[0][i] = 1;
q.push(1);
while (!q.empty()) {
int p = q.front();
vis[p] |= vis[fail[p]];
q.pop();
for (int i = 0; i < alp; i++)
if (trie[p][i]) {
q.emplace(trie[p][i]);
fail[trie[p][i]] = trie[fail[p]][i];
}
else
trie[p][i] = trie[fail[p]][i];
}
}
struct XYCYX {
long double a[N][N];
XYCYX () {
memset(a, 0, sizeof a);
}
XYCYX operator * (const XYCYX &b) const{
XYCYX res;
for (int i = 1; i <= tot + 1; i++)
for (int j = 1; j <= tot + 1; j++)
for (int k = 1; k <= tot + 1; k++)
res.a[i][j] += a[i][k] * b.a[k][j];
return res;
}
}ans, bas;
void init() {
for (int i = 1; i < N; i++)
ans.a[i][i] = 1.0;
for (int p = 1; p <= tot; p++)
for (int i = 0; i < alp; i++) {
if (vis[trie[p][i]]) {
bas.a[p][1] += tmp; //回到根节点
bas.a[p][tot + 1] += tmp;
}
else
bas.a[p][trie[p][i]] += tmp;
}
bas.a[tot + 1][tot + 1] = 1.0;
}
void qpow(int y) {
while (y) {
if (y & 1)
ans = ans * bas;
bas = bas * bas;
y >>= 1;
}
}
char s[N];
int main() {
scanf("%d%d%d", &n, &len, &alp);
tmp = (long double)((long double)1.0 / (long double)alp);
for (int i = 1; i <= n; i++) {
scanf("%s", s);
insert(s);
}
build();
init();
qpow(len);
printf("%.10Lf\n", ans.a[1][tot + 1]);
return 0;
}
upd on 2024.8.23:
对于矩阵优化的一些注意小细节:
- 一般地,
矩阵我们设为单位阵。 - 而
矩阵不用特殊处理,根据题目设出即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!