hdu 4511 (AC自动机)
注意标记一个点后,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自动机)的更多相关文章
- HDU 4511 (AC自动机+状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...
- 小明系列故事――女友的考验 HDU - 4511 AC自动机+简单DP
题意:自己看题目,中文体面. 题解: 把所有不能走的路径放入AC自动机中. 然后DP[i][j]表示走到 i 这个点,且位于AC自动机 j 这个节点最短距离 然后直接DP即可.注意一点会爆int #i ...
- hdu 2896 AC自动机
// hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...
- hdu 3065 AC自动机
// hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...
- hdu 5880 AC自动机
Family View Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- hdu 2296 aC自动机+dp(得到价值最大的字符串)
Ring Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu 3065 AC自动机(各子串出现的次数)
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 5384 AC自动机
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 题意:给n个母串,给m个匹配串,求每个母串依次和匹配串匹配,能得到的数目和. 分析:之前并不知道AC ...
随机推荐
- 简单了解 node net 模块
简单了解 node net 模块 文章记录了对net 模块的简单理解分析. net模块 简单使用 net.Server 类 net.Socket 类 总结 1.1 net模块 Node.js 的 Ne ...
- Java日志打印方法
一.使用log4j打印日志 1. 下载log4j.jar和commons-logging.jar. log4j.jar下载地址:http://logging.apache.org/log4j/ ...
- 一、Linux 设备驱动介绍及开发环境搭建(续)
1.2.6 uboot 编译安装 嵌入式 bootloader 的功能: 功能类似于 PC 的 BIOS.硬件检测是否正常 加载操作系统镜像到 RAM 设置不同的启动方式 常见的启动方式: NOR/N ...
- Tomcat的3种部署方式
tomcat部署的三种方式及优缺点对比 部署方法一:将编译成功的web项目直接放到webapps目录中(注意是编译成功的web项目,也可以是war包): 部署方式二:修改tomcat安装目录下的 ...
- NETCONF
NETCONF协议(Network Configration Protocol) NETCONF是一个基于XML的交换机配置接口,用于替代CLI.SNMP等配置交换机. 本质上来说,NETCONF就是 ...
- canvas 计算文字宽度(常用于文字换行)
var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.font= ...
- 在UIScrollView、UICollectionView和UITableView中添加UIRefreshControl实现下拉刷新
Apple在iOS 6中添加了UIRefreshControl,但只能在UITableViewController中使用,不能在UIScrollView和UICollectionView中使用. 从i ...
- kafka2.12_1.0.1生产者示范代码
import java.util.Properties;import kafka.javaapi.producer.Producer;import kafka.producer.KeyedMessag ...
- tf.stack( )和tf.unstack( )
相同点:他们都增加了矩阵的维度,而split()不改变维度! tf.stack()这是一个矩阵拼接的函数,tf.unstack()则是一个矩阵分解的函数 c是拼接,而d和e则是不同维度的分解
- contenteditable 光标定位到最后
在Vue做项目时,做了一个div[contenteditable=true]的组件作为文本输入框 在非手动输入值后,光标会丢失,经测试以下这段代码可用,直接将光标定位到最后 function keep ...