【HDU】4117 GRE Words AC自动机+线段树优化DP

2024-09-05 14:38

本文主要是介绍【HDU】4117 GRE Words AC自动机+线段树优化DP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门:【HDU】4117 GRE Words


题目分析:水不了啊狸的打字机就来水这题了= =。。。

首先建立ac自动机,然后用fail指针的反向关系建边,构造fail指针树。fail指针树中每个结点u表示的串都是其子节点v的后缀(同时该后缀是所有串中最长的)。对fail指针树dfs一次得到时间戳,当要求以串i结尾的最大价值,首先我们需要知道以串i的子串j结尾的最大价值val。因为在树中我们有关系如上所述,所以我们可以对i串的每个字符xi(对应树上一个结点)找到其在树上的价值最大的后缀,然后取最大加上串i本身的价值,即要求的val。然后我们对i的子树【in[i] , ou[i]】更新,即用val更新区间【in[i] , ou[i]】。查询的时候便是单点查询,查询in[xi](xi为属于串i的每个字符)上的最大值。


我语文体育老师教的。


代码如下:


#include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;#pragma comment(linker, "/STACK:16777216")
#define rep( i , a , b ) for ( int i = ( a ) ; i <  ( b ) ; ++ i )
#define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define clr( a , x ) memset ( a , x , sizeof a )
#define ls ( o << 1 )
#define rs ( o << 1 | 1 )
#define lson ls , l , m
#define rson rs , m + 1 , r
#define root 1 , 1 , ac.cur
#define mid ( ( l + r ) >> 1 )const int MAXN = 300005 ;
const int MAXE = 1000005 ;
const int INF = 0x3f3f3f3f ;struct ac_automaton {int next[MAXN][26] ;int fail[MAXN] ;int ac_root ;int cur ;int Q[MAXN] , head , tail ;int newnode () {rep ( i , 0 , 26 ) next[cur][i] = -1 ;return cur ++ ;}void clear () {cur = 0 ;ac_root = newnode () ;}inline int encode ( char c ) {return c - 'a' ;}void insert ( char* , int ) ;void build () {head = tail = 0 ;fail[ac_root] = ac_root ;rep ( i , 0 , 26 ) {if ( ~next[ac_root][i] ) {fail[next[ac_root][i]] = ac_root ;Q[tail ++] = next[ac_root][i] ;} else next[ac_root][i] = ac_root ;}while ( head != tail ) {int now = Q[head ++] ;rep ( i , 0 , 26 ) {if ( ~next[now][i] ) {fail[next[now][i]] = next[fail[now]][i] ;Q[tail ++] = next[now][i] ;} else next[now][i] = next[fail[now]][i] ;}}}
} ;struct Edge {int v , n ;Edge () {}Edge ( int v , int n ) : v ( v ) , n ( n ) {}
} ;ac_automaton ac ;
Edge E[MAXE] ;
int lazy[MAXN << 2] ;
int maxv[MAXN << 2] ;
int H[MAXN] , cntE ;
int N[MAXN] , cntN ;
int d[MAXN] ;
int word[MAXN] ;
int val[MAXN] ;
int in[MAXN] , ou[MAXN] , dfs_clock ;
char buf[MAXN] ;
int n ;void clear () {cntE = 0 ;dfs_clock = 0 ;clr ( N , -1 ) ;clr ( H , -1 ) ;clr ( lazy , 0 ) ;clr ( maxv , 0 ) ;
}void addedge ( int u , int v , int H[] ) {E[cntE] = Edge ( v , H[u] ) ;H[u] = cntE ++ ;
}void ac_automaton :: insert ( char buf[] , int idx ) {int now = ac_root ;for ( int i = 0 ; buf[i] ; ++ i ) {int index = encode ( buf[i] ) ;if ( next[now][index] == -1 ) next[now][index] = newnode () ;now = next[now][index] ;addedge ( idx , now , N ) ;}word[idx] = now ;
}void dfs ( int u ) {in[u] = ++ dfs_clock ;for ( int i = H[u] ; ~i ; i = E[i].n ) dfs ( E[i].v ) ;ou[u] = dfs_clock ;
}void push_down ( int o ) {if ( lazy[o] ) {lazy[ls] = max ( lazy[ls] , lazy[o] ) ;lazy[rs] = max ( lazy[rs] , lazy[o] ) ;maxv[ls] = max ( maxv[ls] , lazy[o] ) ;maxv[rs] = max ( maxv[rs] , lazy[o] ) ;lazy[o] = 0 ;}
}void push_up ( int o ) {maxv[o] = max ( maxv[ls] , maxv[rs] ) ;
}void update ( int L , int R , int v , int o , int l , int r ) {if ( l == r ) {lazy[o] = max ( lazy[o] , v ) ;maxv[o] = max ( maxv[o] , v ) ;return ;}push_down ( o ) ;int m = mid ;if ( L <= m ) update ( L , R , v , lson ) ;if ( m <  R ) update ( L , R , v , rson ) ;push_up ( o ) ;
}int query ( int x , int o , int l , int r ) {if ( l == r ) return maxv[o] ;push_down ( o ) ;int m = mid ;if ( x <= m ) return query ( x , lson ) ;else return query ( x , rson ) ;
}void solve () {int x ;clear () ;ac.clear () ;scanf ( "%d" , &n ) ;For ( i , 1 , n ) {scanf ( "%s%d" , buf , &val[i] ) ;ac.insert ( buf , i ) ;}ac.build () ;rep ( i , 1 , ac.cur ) addedge ( ac.fail[i] , i , H ) ;dfs ( ac.ac_root ) ;int ans = 0 ;For ( u , 1 , n ) {if ( val[u] < 0 ) continue ;int tmp = 0 ;for ( int i = N[u] ; ~i ; i = E[i].n ) {int  v = E[i].v ;tmp = max ( tmp , query ( in[v] , root ) ) ;}ans = max ( tmp + val[u] , ans ) ;update ( in[word[u]] , ou[word[u]] , tmp + val[u] , root ) ;}printf ( "%d\n" , ans ) ;
}int main () {int T , cas = 0 ;scanf ( "%d" , &T ) ;while ( T -- ) {printf ( "Case #%d: " , ++ cas ) ;solve () ;}return 0 ;
}


这篇关于【HDU】4117 GRE Words AC自动机+线段树优化DP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139241

相关文章

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义