注意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. CentOS7系统 ansible自动化部署多台服务器部署

    CentOS7系统 ansible自动化部署多台服务器部署   Ansible工作机制  从图中可以看出ansible分为以下几个部份: 1> Control Node:控制机器2> In ...

  2. jenkins+Gitlab+maven+tomcat实现自动集成、打包、部署

    一.前言 首先出于提高自己技术水平和琢磨能做点什么能提高工作效率,上线工作实在无聊.重复(手动编译.打包,传包,重启),于是就想到了jenkins,jenkins持续集成已经不是什么新鲜的话题,网上文 ...

  3. 记一个神奇的Bug

    多年以后,当Abraham凝视着一行行新时代的代码在屏幕上川流不息的时候,他会想起2019年4月17日那个不平凡夜晚,以及在那个夜晚他发现的那个不可思议的Bug. 虽然像无数个普普通通的夜晚一样,我在 ...

  4. .Net Core技术研究-Span<T>和ValueTuple<T>

    性能是.Net Core一个非常关键的特性,今天我们重点研究一下ValueTuple<T>和Span<T>. 一.方法的多个返回值的实现,看ValueTuple<T> ...

  5. Unity用Vuforia做AR实现脱卡效果

    这篇不错,记录下,博主不让转载 http://blog.csdn.net/qwe161819/article/details/76107105

  6. 2018-2019-2 20165215《网络攻防技术》Exp6 信息搜集与漏洞扫描

    目录 实验目的 实验内容 基础知识 实验步骤 (一)各种搜索技巧的应用 Google Hacking 搜索网址目录结构 搜索特定类型的文件 路由侦查 (二)DNS IP注册信息的查询 whois域名注 ...

  7. mui返回上个页面并刷新数据

    转 https://blog.csdn.net/mercedescc/article/details/82769264 今天写项目遇到个问题,就是B页面支付操作完成以后,点击返回按钮要到A页面,此时A ...

  8. python简单制作GIF

    第一步安装工具:imageio (已安装好的页面) 第二步:打开python 插入代码,代码如下. import imageio savename = "C://Users//Thinkpa ...

  9. leetcode 66.加一 python3

    class Solution: def plusOne(self, digits): """ :type digits: List[int] :rtype: List[i ...

  10. SQL查询数据时报错

    在开发过程中如果查询报如下的错误: org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column ...