HDU 4787 GRE Words Revenge 在线AC自动机

2024-01-19 03:58

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4787

构造两个自动机 当一个自动机大于节点上限,就将BUFF全部加入AC
有个问题就是TOP在1000的时候能AC 5000和500就会WA不是很懂为什么

代码:

#include <bits/stdc++.h>
#define sf scanf
#define pf printf
using namespace std;
const int maxn = 100000 + 10;
struct AcTrie{int ch[maxn][2],tot,v[maxn],fail[maxn];void Init(){memset( ch[0] , 0 ,sizeof ch[0]);v[0] = 0;tot = 1;}int NewNode(){memset( ch[tot] , 0, sizeof ch[0] );v[tot] = 0;return tot++;}void Insert(char * s){int cur = 0;while(*s){int idx = *s - '0';if(!ch[cur][idx]){ch[cur][idx] = NewNode();}cur = ch[cur][idx];s++;}v[cur] = 1;}void GetFail(){queue<int> Q;Q.push(0);fail[0] = -1;while(!Q.empty()){int cur = Q.front();Q.pop();for(int idx = 0;idx < 2;++idx){if(ch[cur][idx]){int f = fail[cur];while(~f && !ch[f][idx]) f = fail[f];fail[ch[cur][idx]] = (f == -1) ? 0 : ch[f][idx];Q.push(ch[cur][idx]);}}}}int Search(char *s){int cur = 0,ret = 0,f;while(*s){int idx = *s - '0';if(!ch[cur][idx]){f = fail[cur];while(f != -1 && !ch[f][idx]) f = fail[f];cur = (f == -1) ? 0 : ch[f][idx];}else cur = ch[cur][idx];f = cur;while(f){ret += v[f];f = fail[f];}s++;}return ret;}
}ac,buff;
const int maxnn = 5000000 + 50,TOP = 999;
char str[maxnn],tmp[maxnn];void DFS(int rt1,int rt2){ac.v[rt1] = ac.v[rt1] | buff.v[rt2];for(int i = 0;i < 2;++i){if(ac.ch[rt1][i] && buff.ch[rt2][i]) DFS(ac.ch[rt1][i],buff.ch[rt2][i]);else if(!ac.ch[rt1][i] && buff.ch[rt2][i]) DFS(ac.ch[rt1][i] = ac.NewNode(),buff.ch[rt2][i]);}
}
void getRev(int k){int len = strlen(str + 1);char* tmp_s = str + 1,*tmp_tmp = tmp + 1;tmp_tmp[len] = 0;for(int i = 0;i < len;++i) tmp_tmp[i] = tmp_s[ (i + k) % len ];
}
int main(){int T,ca = 0;sf("%d",&T);tmp[0] = '#';while( T-- ){int n,pre = 0;sf("%d",&n);ac.Init();buff.Init();ac.GetFail();buff.GetFail();pf("Case #%d:\n",++ca);for(int i = 0;i < n;++i){sf("%s",str);getRev(pre);if(str[0] == '+') buff.Insert(tmp + 1);else{if(buff.tot > TOP){DFS(0,0);ac.GetFail();buff.Init();buff.GetFail();}else buff.GetFail();pf("%d\n",pre = (buff.Search(tmp + 1) + ac.Search(tmp + 1)));}}}
}

这篇关于HDU 4787 GRE Words Revenge 在线AC自动机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

hdu 3790 (单源最短路dijkstra)

题意: 每条边都有长度d 和花费p,给你起点s 终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 解析: 考察对dijkstra的理解。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstrin

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d