注意fail时怎么走。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,SSZ=,APB=,one=;
const lon INF=0x7FFFFFFF,mod=;
lon n,m,mk[SZ],nex[SZ][APB],fail[SZ];
int cnt,endpos[SSZ],dst[SSZ][SSZ];
int dtb[SZ],dp[][SSZ],len[SSZ];
int ctn[SSZ][SSZ];
char ch[SZ];
string str[SSZ]; void add(int type,int id)
{
int cur=;
for(int i=;ch[i];++i)
{
int c=ch[i]-'';
if(!nex[cur][c])nex[cur][c]=++cnt;
cur=nex[cur][c];
}
if(type)mk[cur]=;
else endpos[id]=cur;
} void build()
{
queue<int> q;
q.push();
for(;q.size();)
{
int fr=q.front();
q.pop();
for(int i=;i<APB;++i)
{
int t=nex[fr][i];
if(t)
{
if(!fr)fail[t]=;
else
{
int u=fail[fr];
for(;u&&!nex[u][i];u=fail[u]);
u=nex[u][i];
fail[t]=u;
mk[t]|=mk[u];
}
q.push(t);
}
}
}
} void bfs(int x)
{
dtb[x]=;
queue<int> q;
q.push(x);
for(;q.size();)
{
int fr=q.front();
q.pop();
for(int i=;i<APB;++i)
{
int t=nex[fr][i];
if(t)
{
if(dtb[t]>dtb[fr]+&&!mk[t])
{
q.push(t);
dtb[t]=dtb[fr]+;
}
}
else
{
int u=fail[fr];
for(;u&&!nex[u][i];u=fail[u]);
t=nex[u][i];
if(dtb[t]>dtb[fr]+&&!mk[t])
{
q.push(t);
dtb[t]=dtb[fr]+;
}
}
}
}
} void init()
{
for(int i=;i<n;++i)
{
//cin>>ch+1;
scanf(" %s",ch+);
len[i]=strlen(ch+);
add(,i);
string tmp(ch+);
str[i]=tmp;
}
for(int i=;i<m;++i)
{
scanf(" %s",ch+);
add(,-);
}
build();
for(int i=;i<n;++i)
{
for(int j=;j<=cnt;++j)
dtb[j]=INF/;
int sta=;
bfs(endpos[i]);
for(int j=;j<n;++j)
{
dst[i][j]=dtb[endpos[j]];
}
}
} int dfs(int sta,int last)
{
//cout<<sta<<" "<<last<<endl;
if(dp[sta][last])return dp[sta][last];
else
{
int res=INF/;
for(int i=;i<n;++i)
{
if(ctn[last][i]&&(sta&(<<i)))sta^=<<i;
}
if(sta==)return len[last];
for(int i=;i<n;++i)
{
if(sta&(<<i))
{
res=min(res,dfs(sta,i)+dst[i][last]);
}
}
return dp[sta][last]=res;
}
} void work()
{
for(int i=;i<n;++i)
{
dp[<<i][i]=len[i];
}
int res=INF/;
for(int i=;i<n;++i)
{
for(int j=;j<n;++j)
{
if(str[i].find(str[j])!=-)ctn[i][j]=;
}
}
// for(int i=0;i<n;++i)
// {
// for(int j=0;j<n;++j)
// {
// cout<<ctn[i][j]<<" ";
// }cout<<endl;
// }
for(int i=;i<n;++i)
{
res=min(res,dfs((<<n)-,i));
//cout<<"i: "<<dfs((1<<n)-1,i)<<" "<<dst[0][1]<<" "<<dst[1][0]<<endl;
}
cout<<res<<endl;
} void release()
{
for(int i=;i<=cnt;++i)
{
mk[i]=;
memset(nex[i],,sizeof(nex[i]));
fail[i]=;
}
cnt=;
for(int i=;i<(<<n);++i)
{
memset(dp[i],,sizeof(dp[i]));
}
} int main()
{
//std::ios::sync_with_stdio(0);
//freopen("d:\\1.txt","r",stdin);
int casenum;
//memset(bel,-1,sizeof(bel));
//cin>>casenum;
//cout<<casenum<<endl;
//for(int time=1;time<=casenum;++time)
for(int time=;cin>>n>>m,n;++time)
{
init();
work();
release();
}
return ;
}

hdoj3247的更多相关文章

  1. 专题训练之AC自动机

    推荐博客:http://www.cnblogs.com/kuangbin/p/3164106.html AC自动机小结 https://blog.csdn.net/creatorx/article/d ...

随机推荐

  1. CentOS 7.5 安装 Python3.7

    1.安装开发者工具 yum -y groupinstall "Development Tools" 2.安装Python编译依赖包 yum -y install openssl-d ...

  2. 蓝桥杯近3年决赛题之二(16年b组)

    做的时候只做对了第一题. 1. 一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里.矿车停在平直的废弃的轨道上.他的面前是两个按钮,分别写着“F”和“B”. 小明突然记起来,这两个按钮可以控制 ...

  3. C# Window Service安装、卸载、恢复选项操作

    using System;using System.Diagnostics;using System.Linq;using System.ServiceProcess; namespace ScmWr ...

  4. Spring中@Async

    在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后, ...

  5. sitecore开发入门Sitecore的CRUD操作 - 第二部分

    在上一篇(sitecore开发入门Sitecore的CRUD操作 - 第一部分)中我们讨论了如何使用Sitecore Item API,Glass,Fortis和Synthesis在Sitecore中 ...

  6. python selenium web自动化测试完整项目实例

    问题: 好多想不到的地方,中间经历了一次重构,好蛋疼: xpath定位使用的不够熟练,好多定位问题,只能靠强制等待解决: 存在功能重复的方法,因为xpath定位不同,只能分开写,有时间可以继续优化: ...

  7. kubernetes 源码安装部署 1.12

    一. 前期准备 参考文档 https://jimmysong.io/kubernetes-handbook/practice/create-tls-and-secret-key.html 1. 安装g ...

  8. 在自定义目录下,按日期创建excel文件

    在指定文件目录下,新建以当前日期命名的excel 文件,如果文件已经存在,在文件中新建一个sheet页来存放数据 import datetime import xlrd, xlwt import re ...

  9. Redis连接池

    package com.lee.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; impor ...

  10. LeetCode Weekly Contest 121

    上周因为感冒没有刷题,两个星期没有刷题,没手感了,思维也没有那么活跃了,只刷了一道,下个星期努力. 984. String Without AAA or BBB Given two integers  ...