BZOJ 3172 [Tjoi2013]单词 AC自动机Fail树
题目链接:【http://www.lydsy.com/JudgeOnline/problem.php?id=3172】
题意:给出一个文章的所有单词,然后找出每个单词在文章中出现的次数,单词用标点符号隔开。
题解:时间很坑啊,朴素的做法是,先在AC自动机上插入单词,并记录下每个单词,然后用每个单词去维护答案。但是这样做时间空间都不允许,只有在插入的时候维护答案。过程是这样的,在插入的时候,每经过一个点,该节点的值加一,同时记录单词末尾的位置,然后在求玩Fail的时候,倒着走回去就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include<bits/stdc++.h> using namespace std; const int maxn = 2024 * 1024 + 15; char tmp[maxn]; struct Aho_C { int Next[maxn][26], Fail[maxn], pos[maxn], cnt[maxn]; int que[maxn], st, ed; int root, sz; int newnode() { for ( int i = 0; i < 26; i++) Next[sz][i] = 0; cnt[sz] = 0; sz++; return sz - 1 ; } void init() { sz = 0; root = newnode(); } void Insert( char buf[], int id) { int len = strlen (buf); int now = root; for ( int i = 0; i < len; i++) { if (!Next[now][buf[i] - 'a' ]) Next[now][buf[i] - 'a' ] = newnode(); now = Next[now][buf[i] - 'a' ]; cnt[now]++; } pos[id] = now; } void getFail() { st = ed = 1; for ( int i = 0; i < 26; i++) if (Next[root][i]) que[ed++] = Next[root][i]; while (st != ed) { int u = que[st++]; for ( int i = 0; i < 26; i++) { int &v = Next[u][i]; if (!v) { v = Next[Fail[u]][i]; continue ; } Fail[v] = Next[Fail[u]][i]; que[ed++] = v; } } for ( int i = ed - 1; i >= 1; i--) cnt[Fail[que[i]]] += cnt[que[i]]; } } ac; int main() { int N; scanf ( "%d" , &N); ac.init(); for ( int i = 1; i <= N; i++) { scanf ( "%s" , tmp); ac.Insert(tmp, i); } ac.getFail(); for ( int i = 1; i <= N; i++) printf ( "%d\n" , ac.cnt[ac.pos[i]]); return 0; } |
想的太多,做的太少。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 本地部署 DeepSeek:小白也能轻松搞定!
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)