注意标记一个点后,fail树上的子节点都会被标记

跑spfa,dp也可以

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include <set>
#include <queue>
#define ll long long
#define ld long double
#define lson l,m,rt<<1
#define pi acos(-1)
#define rson m+1,r,rt<<1|1
#define fo(i,l,r) for(int i = l;i <= r;i++)
#define fd(i,l,r) for(int i = r;i >= l;i--)
#define mem(x) memset(x,0,sizeof(x))
#define eps 1e-8
using namespace std;
const int maxn = ;
const ll inf = 1e9;
const ll mod = ;
ll read() {
ll x=,f=;
char ch=getchar();
while(!(ch>=''&&ch<='')) {
if(ch=='-')f=-;
ch=getchar();
};
while(ch>=''&&ch<='') {
x=x*+(ch-'');
ch=getchar();
};
return x*f;
}
struct Trie{
int nxt[maxn][],fail[maxn],end[maxn];
int root,L;
int newnode(){
for(int i = ;i < ;i++)
nxt[L][i] = -;
end[L++]=;
return L-;
}
void init(){
L = ;
root = newnode();
}
void insert(char buf[],bool bj){
int len = strlen(buf);
int now = root;
for(int i = ;i < len;i++){
if(nxt[now][buf[i]]==-)
nxt[now][buf[i]] = newnode();
now = nxt[now][buf[i]];
}
if(bj)end[now]++;
}
void build(){
queue<int> Q;
fail[root] = root;
for(int i = ;i < ;i++) {
if (nxt[root][i] == -) {
nxt[root][i] = root;
} else {
fail[nxt[root][i]] = root;
Q.push((nxt[root][i]));
}
}
while(!Q.empty()){
int now = Q.front();
Q.pop();
if(end[fail[now]]) end[now]=;
for(int i = ;i < ;i++){
if(nxt[now][i]==-) {
nxt[now][i] = nxt[fail[now]][i];
}else{
fail[nxt[now][i]] = nxt[fail[now]][i];
Q.push(nxt[now][i]);
}
}
}
}
}ac;
int n,m,k;
double xx[maxn],yy[maxn];
char s[];
struct dat{
int u;
int v;
double dis;
}now,nxt;
vector<dat> g[][];
double d[][];
bool vis[][];
double ans;
void spfa(){
queue<dat> q;
fo(i,,ac.L-){
fo(j,,n){
vis[i][j]=false;
d[i][j]=-100.0;
}
}
now.u = ac.nxt[][];now.v=;
q.push(now);
vis[now.u][]=true;d[now.u][]=0.0;
while(!q.empty()){
now = q.front();
q.pop();
for(dat t:g[now.u][now.v]){
if(d[t.u][t.v]<||(d[now.u][now.v]+t.dis<d[t.u][t.v])){
d[t.u][t.v] = d[now.u][now.v]+t.dis;
if(!vis[t.u][t.v]){
vis[t.u][t.v]=true;
q.push(t);
}
}
}
if(now.v==n){
if(ans<||d[now.u][now.v] <ans)ans=d[now.u][now.v];
}
vis[now.u][now.v]=false;
} }
int main() {
while(true){
ac.init();
ans=-1.0;
n=read();m=read();
if(!n&&!m)break;
fo(i,,n){
xx[i]=read();yy[i]=read();
}
fo(i,,m){
k=read();
int t;
fo(j,,k){
t=read();
s[j-]=t;
}
s[k]='\0';
ac.insert(s,true);
}
ac.build();
int v; fo(i,,ac.L-){
fo(j,,n) g[i][j].clear();
fo(j,,n){
v=ac.nxt[i][j];
if(ac.end[v])continue;
now.u = v;
now.v = j;
fo(k,,n){
if(k>=j)continue;
now.dis = sqrt((xx[j]-xx[k])*(xx[j]-xx[k]) + (yy[j]-yy[k])*(yy[j]-yy[k]));
g[i][k].push_back(now);
}
}
}
spfa();
if(fabs(ans)<eps)ans=;
if(ans<-eps)puts("Can not be reached!");
else printf("%.2f\n",ans);
}
return ;
}

hdu 4511 (AC自动机)的更多相关文章

  1. HDU 4511 (AC自动机+状态压缩DP)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...

  2. 小明系列故事――女友的考验 HDU - 4511 AC自动机+简单DP

    题意:自己看题目,中文体面. 题解: 把所有不能走的路径放入AC自动机中. 然后DP[i][j]表示走到 i 这个点,且位于AC自动机 j 这个节点最短距离 然后直接DP即可.注意一点会爆int #i ...

  3. hdu 2896 AC自动机

    // hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...

  4. hdu 3065 AC自动机

    // hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...

  5. hdu 5880 AC自动机

    Family View Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  6. hdu 2296 aC自动机+dp(得到价值最大的字符串)

    Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. hdu 3065 AC自动机(各子串出现的次数)

    病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  9. HDU 5384 AC自动机

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 题意:给n个母串,给m个匹配串,求每个母串依次和匹配串匹配,能得到的数目和. 分析:之前并不知道AC ...

随机推荐

  1. 简单了解 node net 模块

    简单了解 node net 模块 文章记录了对net 模块的简单理解分析. net模块 简单使用 net.Server 类 net.Socket 类 总结 1.1 net模块 Node.js 的 Ne ...

  2. Java日志打印方法

    一.使用log4j打印日志 1. 下载log4j.jar和commons-logging.jar.     log4j.jar下载地址:http://logging.apache.org/log4j/ ...

  3. 一、Linux 设备驱动介绍及开发环境搭建(续)

    1.2.6 uboot 编译安装 嵌入式 bootloader 的功能: 功能类似于 PC 的 BIOS.硬件检测是否正常 加载操作系统镜像到 RAM 设置不同的启动方式 常见的启动方式: NOR/N ...

  4. Tomcat的3种部署方式

    tomcat部署的三种方式及优缺点对比 部署方法一:将编译成功的web项目直接放到webapps目录中(注意是编译成功的web项目,也可以是war包):   部署方式二:修改tomcat安装目录下的  ...

  5. NETCONF

    NETCONF协议(Network Configration Protocol) NETCONF是一个基于XML的交换机配置接口,用于替代CLI.SNMP等配置交换机. 本质上来说,NETCONF就是 ...

  6. canvas 计算文字宽度(常用于文字换行)

    var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.font= ...

  7. 在UIScrollView、UICollectionView和UITableView中添加UIRefreshControl实现下拉刷新

    Apple在iOS 6中添加了UIRefreshControl,但只能在UITableViewController中使用,不能在UIScrollView和UICollectionView中使用. 从i ...

  8. kafka2.12_1.0.1生产者示范代码

    import java.util.Properties;import kafka.javaapi.producer.Producer;import kafka.producer.KeyedMessag ...

  9. tf.stack( )和tf.unstack( )

    相同点:他们都增加了矩阵的维度,而split()不改变维度! tf.stack()这是一个矩阵拼接的函数,tf.unstack()则是一个矩阵分解的函数 c是拼接,而d和e则是不同维度的分解

  10. contenteditable 光标定位到最后

    在Vue做项目时,做了一个div[contenteditable=true]的组件作为文本输入框 在非手动输入值后,光标会丢失,经测试以下这段代码可用,直接将光标定位到最后 function keep ...