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 ...
随机推荐
- Spring Boot自动配置总结
Spring Boot项目启动的时候加载主配置类,并开启了自动配置功能.(Spring Boot的自动配置功能是Spring Boot的一大重要且突出的特性) 那么我们需要了解下它: 如何加载主配置类 ...
- c# task笔记
class Program { //创建Task任务的三种方式(无返回值) static void Main(string[] args) { //方法一 Task task1 = new Task( ...
- (转) IntelliJ IDEA2018激活
IntelliJ IDEA2018破解教程 破解方法:下载破解补丁→修改配置文件→输入激活码→激活成功 由于JetBrains封杀,大部分激活服务器已经不能使用,使用下面的比较麻烦的方法也可以进行破解 ...
- docker安装配置mongodb
1 执行 docker search mongo 命令: 2 运行mongo docker run --name mongo -v /mnt/mongodb:/data/db -p 27017:270 ...
- [uboot] (第二章)uboot流程——uboot-spl编译流程(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...
- enums应用详解
枚举类: 获取枚举相关值:
- 安装python3之后,yum用不了
使用centos 安装python3,并默认python3为python版本之后,用不了yum 原因是yum依赖于python2组件 解决方法: vi /usr/bin/yum 和 vi /usr/l ...
- 知名界面类控件Kendo UI for jQuery R2 2019 SP1发布|附下载
Kendo UI for jQuery提供了在短时间内构建现在Web应用程序所需要的一切.从70多个UI中选择,并轻松地将它们组合起来,创建出酷炫响应式的应用程序,同时将开发时间加快了50%. [适用 ...
- setTimeout延迟加载
使用setTimeout延时计算 setTimeout当时间为0时
- java面向对象5--内部类
6内部类 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. 内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类 ...