博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【AC自动机】【状压dp】【滚动数组】hdu6086 Rikka with String
阅读量:6105 次
发布时间:2019-06-21

本文共 963 字,大约阅读时间需要 3 分钟。

给你m个01串,问你有多少个长度为2L的01串,满足前半段倒置取反后等于后半段,并且包含所有的m个01串。

考虑单词完全在中线前面或者后面的情况,直接将单词及其倒置取反插入AC自动机,AC自动机每个结点用个tag压位记录单词集合。

对于跨越中线的情况,比如说110010是一个单词,枚举一个中线,

11 | 0010

在前面添加上10,变成10 11 | 0010,

那么其前半部分1011也是一个合法的单词,只不过这种类型的单词只有在dp到长度恰好为L时才能用。

于是AC自动机上每个结点记录两种tag,tag1是原始的单词集合(还有将它倒置再取反的单词),tag2是跨越中线的单词。

f(i,j,S)表示长度为i,到第j个结点,当前集合为S的方案数。第一维滚动。i枚举到n-1时,要用tag2,否则只用tag1。
#include
#include
#include
#include
#include
#include
using namespace std;queue
q;#define MOD 998244353int child[2645][2],fail[2645],size,f[2][2645][64],tag[2645],tag2[2645];void Insert(string S,int id){ int len=S.length(); int now=0; for(int i=0;i
>s; int len=s.length();// cout<<"::"<
<
=0;++k,--l){ if((s[k]-'0')^(s[l]-'0')!=1){ flag=0; break; } } if(!flag){ continue; } t=s.substr(0,j+1); for(int k=(j+1)*2;k

转载于:https://www.cnblogs.com/autsky-jadek/p/7309727.html

你可能感兴趣的文章
SQL server 动态行转列
查看>>
Apache Jackrabbit 2.18.1 发布,内容储存库
查看>>
Chrome 72 丢弃 HPKP,不再支持TLS1.0和TLS1.1!
查看>>
程序员被聘用的13个开发技能
查看>>
Spring Boot集成Swagger简易教程
查看>>
CLI使用案例8:使用CLI了解基础资源使用状况
查看>>
Android多线程之HandlerThread源码解析
查看>>
针对电脑小白的使用指南
查看>>
区块链开发公司谈区块链能源的机遇
查看>>
js二叉树,前序/中序/后序(最大最小值,排序)
查看>>
Alpine Docker 安装 bash
查看>>
深入源码分析Java线程池的实现原理
查看>>
Auto Layout 使用心得(三)—— 自定义 cell 并使用 Auto Layout
查看>>
使用passportjs进行登录验证
查看>>
对象数组的快速排序
查看>>
Docker 与分布式数据库结合
查看>>
NGINX的奇淫技巧 —— 5. NGINX实现金盾防火墙的功能(防CC)
查看>>
【机器学习实战】理解Scikit-Learn中分类性能度量指标
查看>>
走进webpack(3)-- 小结
查看>>
Java企业微信开发_01_接收消息服务器配置
查看>>