热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BZOJ1195:[HNOI2006]最短母串AC自动机+状压+搜索

思路比较直接.由于$n$很小,直接定义$f[i][j]$表示当前在自动机中的节点$i,$被覆盖串的集合为$j$的方案数.#include#d

思路比较直接. 

由于 $n$ 很小,直接定义 $f[i][j]$ 表示当前在自动机中的节点 $i,$ 被覆盖串的集合为 $j$ 的方案数.   

#include
#define N 750
#define M 150000
#define setIO(s) freopen(s".in","r",stdin) , freopen(s".out","w",stdout)
using namespace std;
int n,tot,edges,kk;
int Log[30],hd[N],to[N],nex[N],mark[N][5000],fa[M*10],C[M*10];
char str[N];
queueq;
struct Sta
{ int u,sta,id; Sta(int u=0,int sta=0,int id=0):u(u),sta(sta),id(id){}
};
queueQ;
struct Node
{int sta,f,tag,ch[27];
}t[N];
void add(int u,int v)
{nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void insert(int xx)
{ int p&#61;0,i,j,len&#61;strlen(str&#43;1); for(i&#61;1;i<&#61;len;&#43;&#43;i) {int c&#61;str[i]-&#39;A&#39;; if(!t[p].ch[c]) t[p].ch[c]&#61;&#43;&#43;tot; p&#61;t[p].ch[c]; } t[p].tag&#61;1; t[p].sta|&#61;Log[xx];
}
void build()
{ int i,j; for(i&#61;0;i<27;&#43;&#43;i) if(t[0].ch[i]) q.push(t[0].ch[i]),add(0,t[0].ch[i]); for(;!q.empty();) {int u&#61;q.front();q.pop(); for(i&#61;0;i<27;&#43;&#43;i) {int qq&#61;t[u].ch[i]; if(!qq) {t[u].ch[i]&#61;t[t[u].f].ch[i]; continue; } t[qq].f&#61;t[t[u].f].ch[i]; add(t[qq].f,qq); q.push(qq); }}
}
// 继承自己.
void dfs(int x)
{for(int i&#61;hd[x];i;i&#61;nex[i]) {int v&#61;to[i]; t[v].sta|&#61;t[x].sta; dfs(v); }
}
void print(int c)
{ if(C[c]&#61;&#61;-1) return; print(fa[c]); printf("%c",C[c]&#43;&#39;A&#39;);
}
int main()
{ int i,j; scanf("%d",&n); for(i&#61;1;i<&#61;14;&#43;&#43;i) Log[i]&#61;(1<<(i-1)); for(i&#61;1;i<&#61;n;&#43;&#43;i) scanf("%s",str&#43;1),insert(i); build(),dfs(0),C[0]&#61;-1; for(Q.push(Sta(0,0,kk)),mark[0][0]&#61;1;!Q.empty();) {Sta e&#61;Q.front(); Q.pop(); if(e.sta&#61;&#61;Log[n&#43;1]-1) { print(e.id); return 0; } int v; int u&#61;e.u; int idx&#61;e.id; int sta&#61;e.sta; for(i&#61;0;i<27;&#43;&#43;i) { v&#61;t[u].ch[i]; if(!v) continue; if(mark[v][sta|t[v].sta]) {continue; }&#43;&#43;kk; fa[kk]&#61;idx; C[kk]&#61;i; mark[v][sta|t[v].sta]&#61;1; Q.push(Sta(v,(sta|t[v].sta),kk)); }}return 0;
}

  

转:https://www.cnblogs.com/guangheli/p/11551821.html



推荐阅读
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • 题面:P3178[HAOI2015]树上操作好像其他人都嫌这道题太容易了懒得讲,好吧那我讲。题解:第一个操作和第二个操作本质上是一样的&# ... [详细]
  • STM32代码编写STM32端不需要写关于连接MQTT服务器的代码,连接的工作交给ESP8266来做,STM32只需要通过串口接收和发送数据,间接的与服务器交互。串口三配置串口一已 ... [详细]
  • 基于51单片机的多项目设计实现与优化
    本文探讨了基于51单片机的多个项目的设计与实现,包括PID控制算法的开关电源设计、八音电子琴仿真设计、智能抽奖系统控制设计及停车场车位管理系统设计。每个项目均采用先进的控制技术和算法,旨在提升系统的效率、稳定性和用户体验。 ... [详细]
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • 本文介绍了一种使用链剖分(Link-Cut Tree, LCT)来维护动态树结构的方法,特别是如何通过 LCT 来高效地管理子树的信息,如子树大小等。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 在学习了Splay树的基本查找功能后,可能会觉得它与普通的二叉查找树没有太大的区别,仅仅是通过splay操作减少了时间开销。然而,Splay树之所以被誉为“序列之王”,主要在于其强大的区间操作能力。 ... [详细]
  • 题目概述:Sereja 拥有一个由 n 个整数组成的数组 a1, a2, ..., an。他计划执行 m 项操作,这些操作包括更新数组中的特定元素、增加数组中所有元素的值,以及查询数组中的特定元素。 ... [详细]
  • 本文介绍了如何使用 Python 的 Pyglet 库加载并显示图像。Pyglet 是一个用于开发图形用户界面应用的强大工具,特别适用于游戏和多媒体项目。 ... [详细]
  • 题目描述:Balala Power! 时间限制:4000/2000 MS (Java/Other) 内存限制:131072/131072 K (Java/Other)。题目背景及问题描述详见正文。 ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • SSE图像算法优化系列三:超高速导向滤波实现过程纪要(欢迎挑战)
    自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了&#x ... [详细]
author-avatar
cfncjl_130
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有