注意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. 安装mongodb服务

    摘要:https://www.cnblogs.com/z-x-y/p/9305635.html 欢迎转载,转载请标明出处:https://www.cnblogs.com/z-x-y/p/9305635 ...

  2. C#保存日志文件到txt中,可追加保存,定时删除最后一次操作半年前日志文件

    /// <summary> /// 输出指定信息到文本文件 /// </summary> /// <param name="msg">输出信息& ...

  3. 使用 dom4j 处理 xml (3)

    今天想在使用 dom4j 选择节点时,顺便去重,可没有单独去重的方法:倒是有一个可以去重的,还必须提供一个 xpath 作为 排序和去重 的依据. 1.xml 文件 <?xml version= ...

  4. XGBoost 与 Boosted Tree

    http://www.52cs.org/?p=429 作者:陈天奇,毕业于上海交通大学ACM班,现就读于华盛顿大学,从事大规模机器学习研究. 注解:truth4sex  编者按:本文是对开源xgboo ...

  5. JAVA函数的重载和重写

    一.什么是重载(overlording) 在JAVA中,可以在同一个类中存在多个函数,函数名称相同但参数列表不同.这就是函数的重载(overlording).这是类的多太性表现之一. 二.重载的作用: ...

  6. SynchronousQueue------TransferStack源码分析

    s,e在线程栈里面,TransferStack在堆里面,方法只是线程的执行逻辑.线程过来调用transfer方法,线程在堆里面创建一个节点,加到Stack里面去,然后这个线程归属节点的waiter,阻 ...

  7. SpringBoot+Thymeleaf问题

    springboot在controller返回数据到thymeleaf报404 用springboot做一个例子,访问controller可以返回数据,但是到thymeleaf却报404, 检查发现路 ...

  8. 并查集 P3367 【模板】并查集

    P3367 [模板]并查集 #include<iostream> #include<algorithm> #include<cstdio> #include< ...

  9. SlidingMenu第三篇 --- SlidingMenu使用介绍

    在Activity中通过SlidingMenu的构造方法,直接设置侧滑菜单 public class Main2Activity extends Activity { @Override protec ...

  10. 叮咚,你的Lauce上线了!

    哈,2014 - 2016 - 2018,虽然每隔两年才有那么一篇随笔,博客园,我还是爱你的~ 嗯,2018,马上又要失业了,我这是自带黑属性啊啊啊哈,工作了4年多的项目要被砍掉了, 倒不是说非要这个 ...