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维直接在自动机 ...
随机推荐
- dn.net/blueheart20/article/details/22080489
dn.net/blueheart20/article/details/22080489
- Java发出声卡蜂鸣生的方法
方法一: Toolkit.getDefaultToolkit().beep(); 方法二: System.out.println('\007');//八进制数
- 二、C到C++的升级
C++ 的加强主要表现在:类型的加强.面向对象支持 1.C++改进 C++更强调语言的实用性,所有的变量都可以再需要使用的时候再定义,C语言中的变量都必须在作用域开始的位置定义 int c = 0; ...
- JAVA 优先获取外网Ip,再获取内网Ip
1.获取内网Ip private String getLocalhostIp(){ String hostAddress = ""; try { InetAddress addre ...
- FreeRTOS的学习路线
背景 由于之前接触过一些嵌入式RTOS,如Keil-RTX,uCOS-II,也曾经关注过FreeRTOS,但一直没有机会采用FreeRTOS开发.目前FreeRTOS做为主流RTOS,风声正盛.作为嵌 ...
- Ansible学习 Inventory文件
Ansible可同时操作属于一个组的多台主机,组与主机之间关系配置在inventory文件中,inventory默认的配置文件是/etc/ansible/hosts 1.在/etc/ansible/h ...
- B - Sonya and Exhibition CodeForces - 1004B (思维题)
B. Sonya and Exhibition time limit per test 1 second memory limit per test 256 megabytes input stand ...
- 51nod 1105 二分答案法标准题目
二分答案法例题,用于练习二分答案的基本思想非常合适,包括了思维方式转换的内容(以前我们所做的一直是利用二分法求得数组元素对应指针之类,但是现在是直接对答案进行枚举). 思路是:首先对输入数组进行排序, ...
- 配置Wampserver和安装thinksns
一.先安装Wampserver(去官网下载) 二.安装好后单击wampserver图标,Apache->Service->测试80端口,如果显示: i 端口被iis占用 控制面板-> ...
- Android 服务入门
前言:硬着头皮把数据库SQLite看完了,接下来就是android服务了,因为自己本身就是菜鸟,所以呢,也只是做做笔记,技术上的东西就别指望我了. 1.什么是服务呢?举个例子,百度地图,美团外卖,OF ...