BZOJ 4460 [Jsoi2013]广告计划 ——Bitset 后缀自动机
发现n比较小,直接枚举答案,然后发现连续的一段是确定的,然后我们只需要判断每个位置是否有这个连续的一段就好了
发现起点不同,最后的位置可能会有差距,所以DP一下就好了
然后用0表示未折返,1表示从最下面换到最上面,然后就是发现所有位置互不干扰,直接用Bitset压一下就可以做了
复杂度N^3/64
#include <bits/stdc++.h>
using namespace std; #define maxn 100005
int fa[maxn],go[maxn][26],last,cnt,l[maxn],v[maxn],q[maxn];
char s[maxn];
bitset <205> bit[maxn],Nothing,dp[2][2]; void init()
{
last=cnt=1;
} void add(int x,int pos)
{
int p=last,q;
if ((q=go[p][x])){
if (l[q]==l[p]+1) last=q;
else{
int nq=++cnt;
l[nq]=l[p]+1;
memcpy(go[nq],go[q],sizeof go[q]);
fa[nq]=fa[q];
fa[q]=nq;
for (;p&&go[p][x]==q;p=fa[p]) go[p][x]=nq;
last=nq;
}
}
else{
int np=++cnt; l[np]=l[p]+1;
for (;p&&!go[p][x];p=fa[p]) go[p][x]=np;
if (!p) fa[np]=1;
else{
q=go[p][x];
if (l[q]==l[p]+1) fa[np]=q;
else {
int nq=++cnt;
l[nq]=l[p]+1;
memcpy(go[nq],go[q],sizeof go[q]);
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
for (;p&&go[p][x]==q;p=fa[p]) go[p][x]=nq;
}
}
last=np;
}
bit[last][pos]=1;
} void insert()
{
last=1;
scanf("%s",s+1);
int Len=strlen(s+1);
for (int i=1;i<=Len;++i){
add(s[i]-'a',i);
}
} void Radix()
{
for (int i=1;i<=cnt;++i) v[l[i]]++;
for (int i=1;i<=cnt;++i) v[i]+=v[i-1];
for (int i=cnt;i>=1;--i) q[v[l[i]]--]=i;
for (int i=cnt;i>=1;--i)
bit[fa[q[i]]]|=bit[q[i]];
} int n,m,Len;
char t[maxn]; bool test(int x)
{
int now=1,pre=0;
dp[now][0].reset();
dp[now][1].reset();
dp[now][0].set();
int all=(Len+x-1)/x;
for (int i=1;i<=x;++i){
int pos=1,flag=1,tmp=0;
now^=1; pre^=1;
for (int j=i;j<=Len;j+=x){
pos=go[pos][t[j]-'a'];
tmp++;
if (!pos) {flag=0;break;}
}
if (flag){
bitset<205> Match=bit[pos];
if (tmp<all) Match<<=1;
dp[now][0]=dp[pre][0]&Match;
dp[now][1]=dp[pre][1]&Match;
dp[now][1]=(dp[pre][1]|(dp[pre][0]<<1))&Match;
}
else{
return false;
}
}
if (dp[now][0].count()||dp[now][1].count()) return true;
else return false;
} int main()
{
#ifdef WXL
freopen("in.txt","r",stdin);
#endif init();
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i){
insert();
} bitset<205> Test; Radix(); Nothing.reset();
scanf("%s",t+1);
Len=strlen(t+1);
for (int i=1;i<=Len;++i){
if (test(i)) {
printf("%d\n",i);
return 0;
}
}
printf("No Sulotion\n");
}
BZOJ 4460 [Jsoi2013]广告计划 ——Bitset 后缀自动机的更多相关文章
- BZOJ 4516: [Sdoi2016]生成魔咒 后缀自动机 性质
		http://www.lydsy.com/JudgeOnline/problem.php?id=4516 http://blog.csdn.net/doyouseeman/article/detail ... 
- BZOJ 4327 JSOI2012 玄武密码(后缀自动机)
		[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4327 [题目大意] 求每个子串在母串中的最长匹配 [题解] 对母串建立后缀自动机,用每 ... 
- bzoj 4566 找相同字符 —— 广义后缀自动机
		题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4566 建出两个串的广义后缀自动机: 统计每个点在两个串中出现次数的子树和,其实就是在两个串中 ... 
- 【BZOJ 4199】[Noi2015]品酒大会 后缀自动机+DP
		题意 两个长度为$r$的子串相等称为$r$相似,两个$r$相似的权值等于子串开头位置权值乘积,给定字符串和每个位置权值,求$r$相似子串数量和最大权值乘积 对反串建立后缀自动机得到后缀树,后缀树上两个 ... 
- BZOJ 4516 [Sdoi2016]生成魔咒 ——后缀自动机
		本质不同的字串,考虑SA的做法,比较弱,貌似不会. 好吧,只好用SAM了,由于后缀自动机的状态最简的性质, 所有不同的字串就是∑l[i]-l[fa[i]], 然后后缀自动机是可以在线的,然后维护一下就 ... 
- BZOJ.5417.[NOI2018]你的名字(后缀自动机 线段树合并)
		LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\ ... 
- BZOJ4460 : [Jsoi2013]广告计划
		首先预处理出$f[i][j]$表示第$i$位是字符$j$的字符串集合. 考虑枚举答案$n$,那么模式串中模$n$相同的字符都要按顺序在同一行出现. 设$g[i][j]$表示第$i$列开始出现模$n$为 ... 
- BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)
		题目链接 后缀数组做法见这. 直接SAM+map.对于每个节点其产生的不同子串数为len[i]-len[fa[i]]. //15932kb 676ms #include <map> #in ... 
- BZOJ 3676: [Apio2014]回文串 后缀自动机 Manacher 倍增
		http://www.lydsy.com/JudgeOnline/problem.php?id=3676 过程很艰难了,第一次提交Manacher忘了更新p数组,超时,第二次是倍增的第0维直接在自动机 ... 
随机推荐
- 管道命令'|'   和xargs  find命令找到后把所有找到的删除
			管道符号,是unix功能强大的一个地方,符号是一条竖线:"|", 用法: command 1 | command 2 他的功能是把第一个命令command 1执行的结果作为comm ... 
- Linux内核参数min_free_kbytes
			1. min_free_kbytes 先看官方解释: This is used to force the Linux VM to keep a minimum number of kilobytes ... 
- solr dataimport
			solrconfig.xml <requestHandler name="/dataimport" class="org.apache.solr.handler.d ... 
- JAVA JDBC  连接 Oracle
			使用 Junit 测试类编写 public class JdbcTest { private Connection con = null;// 创建一个数据库连接 private PreparedSt ... 
- 转载:jsonp详解
			json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西.今天总算搞明白了.下面一步步来搞清楚jsonp是个什么玩意. 同源策略 首先 ... 
- 14.3-ELK重难点总结和整体优化配置
			本文收录在Linux运维企业架构实战系列 做了几周的测试,踩了无数的坑,总结一下,全是干货,给大家分享~ 一.elk 实用知识点总结 1.编码转换问题(主要就是中文乱码) (1)input 中的cod ... 
- 短信验证码js
			var isSmsSend = false; function clickButtona(obj){ var obj = $(obj); var mobile=$("input[name=m ... 
- 【JavaScript】修改图片src属性切换图片
			今天做项目时其中一个环节需要用到js修改图片src属性切换图片,现在来记录一下 以下是示例: html <img src="/before.jpg" id="img ... 
- U1
			如果 activity_main.xml没有xml代码可以对图像右键 go to mxl同时可以在design 和 text 切换 在安装了Android Studio3.3版本之后,第一个He ... 
- eclipse中设置JVM内存
			一. 修改jdk 使用内存: 找到eclispe 中window->preferences->Java->Installed JRE ,点击右侧的Edit 按钮,在编辑界面中的 ... 
