发现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 后缀自动机的更多相关文章

  1. BZOJ 4516: [Sdoi2016]生成魔咒 后缀自动机 性质

    http://www.lydsy.com/JudgeOnline/problem.php?id=4516 http://blog.csdn.net/doyouseeman/article/detail ...

  2. BZOJ 4327 JSOI2012 玄武密码(后缀自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4327 [题目大意] 求每个子串在母串中的最长匹配 [题解] 对母串建立后缀自动机,用每 ...

  3. bzoj 4566 找相同字符 —— 广义后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4566 建出两个串的广义后缀自动机: 统计每个点在两个串中出现次数的子树和,其实就是在两个串中 ...

  4. 【BZOJ 4199】[Noi2015]品酒大会 后缀自动机+DP

    题意 两个长度为$r$的子串相等称为$r$相似,两个$r$相似的权值等于子串开头位置权值乘积,给定字符串和每个位置权值,求$r$相似子串数量和最大权值乘积 对反串建立后缀自动机得到后缀树,后缀树上两个 ...

  5. BZOJ 4516 [Sdoi2016]生成魔咒 ——后缀自动机

    本质不同的字串,考虑SA的做法,比较弱,貌似不会. 好吧,只好用SAM了,由于后缀自动机的状态最简的性质, 所有不同的字串就是∑l[i]-l[fa[i]], 然后后缀自动机是可以在线的,然后维护一下就 ...

  6. BZOJ.5417.[NOI2018]你的名字(后缀自动机 线段树合并)

    LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\ ...

  7. BZOJ4460 : [Jsoi2013]广告计划

    首先预处理出$f[i][j]$表示第$i$位是字符$j$的字符串集合. 考虑枚举答案$n$,那么模式串中模$n$相同的字符都要按顺序在同一行出现. 设$g[i][j]$表示第$i$列开始出现模$n$为 ...

  8. BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)

    题目链接 后缀数组做法见这. 直接SAM+map.对于每个节点其产生的不同子串数为len[i]-len[fa[i]]. //15932kb 676ms #include <map> #in ...

  9. BZOJ 3676: [Apio2014]回文串 后缀自动机 Manacher 倍增

    http://www.lydsy.com/JudgeOnline/problem.php?id=3676 过程很艰难了,第一次提交Manacher忘了更新p数组,超时,第二次是倍增的第0维直接在自动机 ...

随机推荐

  1. 2018.6.7. 云服务器Centos系统使用yum或者rpm安装包时出现问题,安装时报出错误:

    当我向终端输入 sudo yum groupinstall chinese-support 语言安装包的时候显示下面的错误 error: rpmdb: BDB0113 Thread/process 3 ...

  2. 理解dropout

    理解dropout 注意:图片都在github上放着,如果刷不开的话,可以考虑FQ. 转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/490 ...

  3. Python实现进度条小程序

    一.print()参数介绍 1.end:指定打印结束后添加的字符,默认值为换行符 for j in range(3): print('hello world') for i in range(3): ...

  4. AngularJS 对象

    AngularJS对象就像JavaScript对象 <!DOCTYPE html><html><head><meta http-equiv="Con ...

  5. Oracle 表的连接方式

    1. 连接说明 ① Oracle一次只能连接两个表.不管查询中有多少个表,Oracle 在连接中一次仅能操作两张表. ② 当执行多个表的连接时,优化器从一个表开始,将它与另一个表连接:然后将中间结果与 ...

  6. 前端开发APP,从HBuilder开始~

    内容简介 介绍目前前端人员开发app的几种方法,具体介绍hbuilder开发app,一扇赞新的大门~ 无所不能的js 最开始js仅仅局限于网页上一些效果,操作网页内容等, 但是nodejs把js带入了 ...

  7. Java读取各种文件格式内容

    所需的jar包哦也不要太记得了,大家可以搜搜,直接上代码: import java.io.BufferedInputStream; import java.io.File; import java.i ...

  8. 【前端_js】解决ajax跨域请求数据

    1.ajax发送请求必须遵循同源策略,即请求方和相应方的协议头.域名.端口全部一样.只要三者有一个不一样都视为跨域,浏览器出于安全考虑不允许跨域访问. 解决ajax跨域访问的常用方法: a.使用jso ...

  9. jQuery编码中的一些技巧

    缓存变量 DOM遍历是昂贵的,所以尽量将会重用的元素缓存. // 糟糕 h = $('#element').height(); $('#element').css('height',h-20); // ...

  10. 获取页面URL参数值

    JavaScript function GetParams(urlAddress) { var i, strLength, str, keyName, keyValue, params = {}, u ...