发现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");
}

  

最新文章

  1. 如何使用FileZilla上传和下载文件
  2. CURL常用命令
  3. 谈谈vertical-align的text-bottom和text-top - 韦奕
  4. hash-4.hashtable
  5. scrapy爬虫成长日记之将抓取内容写入mysql数据库
  6. asp登陆例子,asp,mssql,登陆
  7. selenium-webdriver(python) (十) 如何处理下拉框
  8. ie8中使用placeholder
  9. Linux svn直接删除版本库文件
  10. AngularJs练习Demo19 Resource
  11. Android中利用httpclient进行网络通信的方法(以用户登录为例说明)
  12. 深入理解Java虚拟机---学习感悟以及笔记
  13. python转换图片格式
  14. Servlet之过滤器(Filter)
  15. 5; XHTML图像
  16. MySQl ifnull()和substr()
  17. ie每次登陆出现:Windows安全性 iexplore.exe 正在连接到 记住我的凭证不起作用
  18. cf1000D Yet Another Problem On a Subsequence (dp)
  19. Lodash JavaScript 实用工具库
  20. HashMap的实现原理-----哈希讲解

热门文章

  1. 2017.12.6 计算机算法分析与设计---------Fibonacci数列
  2. Java实现随机出题,10道10以内加减法计算
  3. 通过Tcode查找Badi或者客户出口
  4. 【前端_js】前端跨网络异步获取资源——fetch()
  5. 搭建zipkin参数配置
  6. thinkphp 5数据库操作
  7. nginx+django线上部署
  8. python语言介绍
  9. 手机注册过哪些网站37kfenxi.com,查询注册过哪些网站
  10. 如何使用DroidPlugin——DroidPlugin初体验