poj 1204 trie树/AC自动机(在二维词表中找词)

poj 3171 dp+线段树(最小代价覆盖全部区间) 题意:给定一个需要覆盖的区间[m,e],给出n个区间[ai,bi],每个区间有一个权值wi。求能够把[m,e]覆盖所选取的区间的最小代价之和。 思路:如果没有权值,那么贪心可以解决这个问题,见poj2376。但是此处带权,那么贪心不成立,需要考虑用动态规划。先将所有区间的代价设置为无限大,然后将给的n区间按左优先排序,然后进行一趟遍历:第i个区间为[a,b],先查询[a-1,b-1]区间的最小值 阅读详情

题意:给定一个n*m大小的二维词表(0<n,m<=1000),然后给出不多于1000个单词。要求给出单词在词表中的位置(首字母位置和旋转方向)

思路1:一开始想也没想就写了暴搜,果断TLE。之后瞄了一眼题解都说用trie或者ac自动机。就算这样还是没想出怎么用trie存词表。原来是用trie存待查单词,对于词表,仍然是暴搜。注意虽然题目中没给每个单词的长度,但是长度上限可以确定,也就是词表的长或宽的上限,即1000。(一开始还在想对角线最长,大概是1000倍的根2,犯傻逼了)

注意不加这句:p->id= 0的话就会wa,加上就ac。一开始我认为题目是special judge,所以加不加没有区别。实际上匹配了一个字符串,后面num就加一,所以如果有串重复匹配,那么到最后可能出现有串没有匹配上的情况,所以匹配完一个串,必须将其置零。

思路2:将待查单词建立DFA,然后在词表中从最长的串去匹配。注意算起始点的方法。

trie树:

#include <stdio.h>
#include <string.h>
#define N 1005
typedef struct node{
    int id;
    struct node* next[26];
}node;
node *alloc,*root,trie[1414000];
struct output{
    int x,y,o;
}res[N];
char s[N][N],t[1444];
int n,m,k;
int orient[8][2] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
void init(){
    int i;
    alloc = trie;
    root = alloc++;
    root->id = 0;
    for(i = 0;i<26;i++)
        root->next[i] = NULL;
}
void insert(char* x,int id){
    int i,j;
    node *p,*q;
    p = root;
    for(i = 0;x[i]!='\0';i++){
        if(!p->next[x[i]-'A'])
            break;
        p = p->next[x[i]-'A'];
    }
    for(;x[i]!='\0';i++){
        q = alloc++;
        q->id = 0;
        for(j = 0;j<26;j++)
            q->next[j] = NULL;
        p->next[x[i]-'A'] = q;
        p = q;
    }
    p->id = id;
}
int in(int x,int y){
    return x>=0&&x<n&&y>=0&&y<m;
}
int search(int x,int y,int ori){
    int num=0,xx = x,yy = y;
    node *p = root;
    while(in(x,y) && (p = p->next[s[x][y]-'A'])){
        if(p->id){
            num++;
            res[p->id].x = xx;
            res[p->id].y = yy;
            res[p->id].o = ori;
            p->id= 0;//不加这句就会wa;一开始以为题目是special judge啊,所以我觉得这句加不加无所谓。实际上匹配了一个字符串,后面num就加一,所以如果有串重复匹配,那么到最后可能出现有串没有匹配上的情况,所以匹配完一个串,必须将其置零
        }
        x += orient[ori][0];
        y += orient[ori][1];
    }
    return num;
}
void brute(){
    int i,j,p,num=0;
    for(i = 0;i<n;i++)
        for(j = 0;j<m;j++)
            for(p = 0;p<8;p++){
                num += search(i,j,p);
                if(num == k)
                    return;
            }
}
int main(){
    int i;
    init();
    scanf("%d %d %d",&n,&m,&k);
    for(i = 0;i<n;i++)
        scanf("%s",s[i]);
    for(i = 1;i<=k;i++){
        scanf("%s",t);
        insert(t,i);
    }
    brute();
    for(i = 1;i<=k;i++)
        printf("%d %d %c\n",res[i].x,res[i].y,res[i].o+'A');
    return 0;
}


思路2:AC自动机

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstdlib>
using namespace std;
int T,n,num,res,m,k;
char s[1005][1005],w[1005];
int out[1005][3],len[1005];
int ori[8][2] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
struct trie{
    struct trie *next[26];
    struct trie *pre;
    bool bad;
    int id;
    void init(){
        memset(next, NULL, sizeof(next));
        pre = NULL;
        bad = false;
        id = -1;
    }
}t[1000005],*root;
queue<struct trie*> q;
void insert(char* s,struct trie* r,int id){//建立trie树
    for(int i = 0;s[i];i++){
        if(r->next[s[i]-'A'] == NULL)
            r->next[s[i]-'A'] = t+(++num);
        r = r->next[s[i]-'A'];
    }
    r->bad = true;
    r->id = id;
}
void buildDFA(){                        //构造DFA
    int i;
    for(i = 0;i<26;i++)                 //t[0]是附加结点,方便建立DFA
        t[0].next[i] = t+1;
    t[1].pre = t;
    t[0].pre = NULL;
    q.push(t+1);
    while (!q.empty()) {                //按照层次处理结点,所以需要队列
        struct trie *now = q.front(),*p,*pre;
        q.pop();
        for(i = 0;i<26;i++){
            p = now->next[i];           //p是当前要处理的结点
            if(p){
                pre = now->pre;         //前向(失败)结点,目的是找前向结点的next[i]结点
                while(pre){
                    if(pre->next[i]){   //最往上找到t[0],那么t[0].next[i]一定为真,且为根节点
                        p->pre = pre->next[i];
                        if(pre->next[i]->bad)
                            p->bad = true;
                        break;
                    }
                    pre = pre->pre;
                }
                q.push(p);
            }
        }
    }
}
int check(int x,int y){
    return x>=0&&x<n&&y>=0&&y<m;
}
void search(int x,int y,int oo){
    int xx,yy;
    struct trie *p,*r;
    xx = x;
    yy = y;
    r = t+1;
    while(check(xx,yy)){
        while(!r->next[s[xx][yy]-'A'])
            r = r->pre;
        r = r->next[s[xx][yy]-'A'];     //往下走一格
        p = r;
        while(p){
            if(p->bad){                 //有bad为真说明找到了一个子串
                out[p->id][0] = xx - (len[p->id]-1)*ori[oo][0];
                out[p->id][1] = yy - (len[p->id]-1)*ori[oo][1];
                out[p->id][2] = oo;
                p->bad = false;
            }
            p = p->pre;
        }
        xx += ori[oo][0];
        yy += ori[oo][1];
    }
}
int main(){
    int i;
    scanf("%d %d %d",&n,&m,&k);
    num = 1;
    for(i = 0;i<n;i++)
        scanf("%s",s[i]);
    for(i = 0;i<k;i++){
        scanf("%s",w);
        insert(w,t+1,i);
        len[i] = strlen(w);
    }
    buildDFA();
    for(i = 0;i<n;i++){
        search(i,0,1);
        search(i,0,2);
        search(i,0,3);
        search(i,m-1,5);
        search(i,m-1,6);
        search(i,m-1,7);
    }
    for(i = 0;i<m;i++){
        search(0,i,3);
        search(0,i,4);
        search(0,i,5);
        search(n-1,i,7);
        search(n-1,i,0);
        search(n-1,i,1);
    }
    for(i = 0;i<k;i++){
        printf("%d %d %c\n",out[i][0],out[i][1],out[i][2]+'A');
    }
    return 0;
}


科技中介服务机构想要提升服务效率,需要哪些数智工具支持?.docx 科技中介服务机构想要提升服务效率,需要哪些数智工具支持? 立即下载

相关推荐

usb 扩容盘检测修复工具源码,编译产物

usb 扩容盘检测修复工具源码,编译产物

字符串匹配2——多模式匹配(Trie树 AC自动机)

前言 紧接着上一篇文章字符串匹配1,在上一篇文章里,我们主要总结归纳的是一个字符串和另一个字符串相比较。这篇文章,南国总结归纳的是两种常见的多模式匹配算法Trie树和AC自动机 多模式匹配:一个主串和多个模式串中间的匹配问题。 当然,聪明的你一定会问难道之前所学的单模式匹配的算法就不能用;爱解决问题吗? 答案是当然可以,但是用单模式的字符串算法解决这类问题总体的时间开销就会大很多,对于这类问题 我...

南国的技术栈 2079

融合UWB和IMU割草机定位EKF研究(Matlab代码实现)

内容概要:本文主要介绍了一个名为“Plecs全桥LLC谐振变换器仿真模型”的技术资源,该资源聚焦于电力电子领域中的LLC谐振变换器建模与仿真,涵盖开环、闭环控制、软启动设计及参数优化等核心内容。文档不仅提供了LLC变换器的详细建模方法与仿真案例,还系统梳理了其在高效电源转换系统中的应用,包括隔离型全桥拓扑结构的设计与性能分析。此外,资源汇总了大量Matlab/Simulink仿真模型及相关科研方向,涉及新能源并网、储能控制、电机驱动等多个前沿领域,全面展示LLC谐振变换器在现代电力系统中的关键技术实现路径。同时,文档附带多种学习资料获取途径,如网盘链接和公众号资源,便于研究人员深入实践与拓展研究。; 适合人群:具备扎实的电力电子、自动控制理论基础,从事新能源发电、开关电源设计、电力系统仿真等相关领域的研究生、工程师及科研人员。; 使用场景及目标:①深入理解LLC谐振变换器的工作原理、建模方法与控制策略;②开展电力电子变换器的仿真验证与参数优化设计;③支撑科研项目、学位论文或工程项目的系统仿真与方案验证; 阅读建议:建议结合所提供的仿真模型与参考文献,使用Plecs或Simulink软件进行动手实践,重点掌握LLC谐振变换器的建模流程、闭环控制设计、软启动机制及参数调试技巧,以全面提升在实际工程中的应用与创新能力。

poj 2492 并查集(虫子交配,同性恋?)

题意:一组昆虫性别性别有个哦你

dearmango 3036

基于变频控制的多相交错LLC谐振变换器闭环仿真(Simulink仿真实现)

基于变频控制的多相交错LLC谐振变换器闭环仿真(Simulink仿真实现)内容概要:本文主要介绍了基于Plecs的全桥LLC谐振变换器仿真模型,涵盖变频控制下的多相交错LLC谐振变换器闭环仿真、V2G电动汽车ACDC整流与双向CLLC谐振变换器充放电仿真、LLC谐振变换器的开环与闭环软启动设计,以及储能系统中双向Buck-Boost变换器结合模型预测电流控制和电压下垂控制的仿真研究。同时,文档列举了多种电力电子系统与控制策略的Simulink/Plecs仿真案例,涉及三相交错并联Buck变换器、三电平Buck直流变换器、单相Boost PFC电路等,展示了丰富的电力变换器建模与控制技术。此外,还包括参数设计报告、计算书及相关参考文献,适用于从事电力电子、新能源发电、电动汽车充放电系统等领域的研究人员和技术开发人员。; 适合人群:具备电力电子、自动控制理论基础,从事新能源、电动汽车、电力系统等相关领域研究的研发人员、高校研究生及高年级本科生。; 使用场景及目标:① 学习和掌握LLC谐振变换器及其他典型电力电子变换器的工作原理与建模方法;② 实现闭环控制策略如变频控制、软启动、模型预测控制、下垂控制等的仿真验证;③ 支持科研项目、毕业设计或工程开发中的系统仿真与优化设计。; 阅读建议:建议结合文中提供的仿真模型、设计报告与参考文献,逐步搭建并调试相应系统,重点关注控制策略的实现细节与参数整定过程,以深入理解系统动态响应特性与控制性能。

从POI兴趣点获取到ArcGIS中热力图制作

1. POI获取及坐标点转换 POI获取我们要借助下面这个网站↓↓↓ 规划云http://guihuayun.com/poi/ 搜索POI兴趣点并复制兴趣点, 图 新建txt文本文档,粘贴兴趣点 图片 查看后得知,lng为横坐标,lat为纵坐标 文件,另存为csv格式文件,编码为utf—8 打开QGIS,因为我们pol点是从百度地图上获取的,为BD09坐标系,与WGS84有一定偏移【GCJ02:火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。 BD09:为.

qq_43173805的博客 5598

poj 2227 优先队列应用(能装多少水)

题意:一个n*m矩形区域,其中每个1*1都是有高度的矩形块,高低起伏,求最多储水量。(边界不能储水) 题解:先将边界装入优先队列中(高度越小越优先),并标记为已访问。看队首元素四周未访问过的点,1、如果该点不比队首低,则将它加入队列,标记为已访问,即它变成了新的边界。2、该点比队首低,意味着该点可以储水,更新res值,同时将它加入队列中,但是它的高度为原队首元素的高度,即以它为边界的点不能超过这

dearmango 1086

使用cartographer纯定位替换amcl定位

经过实际使用,发现cartographer定位对于重定位的表现比amcl好。如果机器人的起始位置离原点较远,amcl很难自行重定位到正确的位置,只能手动修改初始位置。然而cartographer定位的表现则很好,在行驶一段距离或原地旋转一段时间后能够正确重定位。

XJ_75的博客 8313

poj 2528/3277 线段树(海报覆盖)

题意:给定一些海报,可能互相重叠,告诉你每个海报宽度(高度都一样)和先后叠放次序,问没有被完全盖住的海报有多少张。 思路:

dearmango 988

【TM1650】STM8S TM1650芯片控制程序

以下为.h文件: #ifndef __TM1650_I2C_H #define __TM1650_I2C_H #include "stm8s.h" #include "stm8s_gpio.h" #include "tim1.h" #include "usart2.h" #include &lt;iostm8s103f3.h&gt; #include &lt;intrinsics....

cxw312864660的博客 1万+

毕业论文管理系统的设计与实现

毕业论文工作是高等学校本科培养阶段的一个重要环节。目前论文管理工作存在着许多问题,例如人工管理极为不便;学生对论文所要撰写的内容并不十分了解,与指导老师的沟通非常不便;老师的指导监督也很难完全到位;手工评审的效率低等。而现有的一些毕业论文信息管理或答辩评审系统只是实现了部分网上交流和评审管理的功能,在答辩评审的自测和项目指标权重等方面都存在着一定的不足。因此,本文设计的毕业论文管理系统采用B/S模式开发。其中,Browser层使用JSP技术开发;

wqq_992250277的博客 3183

poj 2418 BST(计算树木的比例)

题目翻译:硬木在植物学中是一类树,它具有阔叶,生产水果或者坚果,并且通常在冬天休眠。美国的温度气候产生了上百种硬木品种,即拥有特定生物学特征的树。例如,尽管橡树、枫树和樱桃树都属于硬木,但是它们属于不同的品种。总体来说,在美国所有的硬木品种大约占据所有树木的百分之四十。 另一方面,软木(或者称之为针叶树),拉丁语意为“圆锥轴承”,是有针状叶子的一类树。美国广泛存在的软木包括雪松、冷杉、铁杉、松树

dearmango 907

ue4 classuobject没有成员beginplay_【教程】UE4 C++实现简单的AI及遇到的坑

后续文章更新移步→微信公众号“虚幻社区”(mantra-xhsq),您的支持是我创作的动力。我们这篇文章的宗旨是用代码实现简单的AI,有多简单,只是搭建一个具有PawnSensing组件和回调的AI。重点也不是做一个AI,而是了解一下C++代码如何搭建最基本的AI(关于蓝图如何创建请自行百度)。如果英语还不错的话,可以移步 参考链接,链接中的内容除了创建基本的PawnSensing组件还有关于行为...

weixin_39929918的博客 1127

poj 3321/3263 树状数组(苹果树/排身高)

题意:每个分叉点及末梢可能有苹果(最多1个), 每次可以摘掉一个苹果,或有一个苹果新长出来,随时查询某个分叉点所在的子树里, 一共有多少个苹果。 思路:深度优先遍历整个苹果树,为每个节点标记一个开始时间和结束时间(所有时间都不相同),显然子树里面所有节点的开始和结束时间,都位于子树树根的开始和结束时间之间。那么苹果的有无只需在开始时间那个点(在结束时间那个点上也可以)上面进行加减1的操作即可。然

dearmango 902

AIGC算法工程师-面试八股文-2025年版本-算法八股文/工程八股文/开放式问题

​两年前整理了《AIGC算法工程师 面试八股文》,全网一共有100w读者看过,收到了很多小伙伴的催更。Diffusion的技术发展非常快,博主特意整理了最近两年最新的八股文,内容非常全面,涵盖算法八股文/工程八股文/开放式问题三个大类,希望能为求职的读者们带来帮助。

沉迷单车的追风少年 4187

区块链技术概述:从比特币到Web3.0

区块链技术正重塑数字世界的信任机制。本文系统梳理了区块链的发展路径:从比特币的PoW共识和UTXO模型,到以太坊的智能合约和账户体系,直至Web3.0的去中心化互联网愿景。文章详细解析了区块链的核心特性(去中心化、不可篡改等)和数据结构,通过流程图展示了比特币交易生命周期和智能合约执行流程,并对比了Web2.0与Web3.0的关键差异。最后,用Python代码实现了包含区块类、交易处理和挖矿机制的简易区块链系统,为理解区块链底层原理提供了实践参考。

闲人编程的博客 457

poj 3250 单调栈(看到前面的牛的数量)

题意:一群高度不完全相同的牛从左到右站成一排,每头牛只能看见它右边的比它矮的牛的发型,若遇到一头高度大于或等于它的牛,则无法继续看到这头牛后面的其他牛。给出这些牛的高度,要求每头牛可以看到的牛的数量的和。 思路:单调栈(类似2559和3934),栈中按照递减顺序保存牛的高度,对于当前牛判断它入栈的位置。其实stack不必设置h域,stack只存下标即可,找栈中高度用s[下标]就行了。 看到另一

dearmango 871

binning模式下和normal模式下相同曝光参数相同场景加权亮度差异消除方案优化(一)

摘要:针对ISP参数设置中浮点权重系数需转换为整数的问题,提出整数邻域搜索方案。该方法在浮点最优解附近(±1/±2)进行局部搜索,通过逐阶微调找到误差最小的整数权重组合,避免直接取整导致的误差反弹(误差从0.8%降至0.35%)。方案结合范围约束(1~15)和单调性约束(暗端递减、亮端递增),兼顾计算效率(单图耗时<10ms)与硬件兼容性,显著优于暴力搜索和简单取整,满足工程落地需求。

大熊 97

poj 1456 贪心+并查集优化(卖带截止时间货物的最大利润)

题意:给定若干中商品,每种商品有两个属性,一个是其售价,另一个是其最晚售出时间,从 思路:

dearmango 868

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

poj 2002 hash(平面上若干点能够成多少正方形)

题意:给定二维平面上不超过1000个点(点坐标的绝对值 思路:枚举两个顶点,可以确定另外两个顶点的位置,判断另外两个顶点是否存在于点集中。先用hash把点存储一下,然后判断。此处用了stl 的set。 因为多组,所以一开始要清空set,忘了这一步导致wa了多次。 #include #include #include #include using namespace std; int

dearmango 836

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

poj 2104 划分树(查询区间第k大数)

题意:给定一个n个数的数组,有m个查询,每个查询为[a,b,k],意思是区间[a,b]的第k大数。 思路:由这个题认识了什么叫做划分树。划分树的基本思想就是对于某个区间,把它划分成两个子区间,左边区间的数小于右边区间的数。查找的时候通过记录进入左子树的数的个数,确定下一个查找区间,最后范围缩小到1,就找到了。 建树的过程比较简单,对于区间[l,r],首先通过对原数组的排序找到这个区间的中位数a

dearmango 762

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

poj 3494 dp(最大全1子矩阵)

题意:给定一个n*m大小的0-1矩阵,

dearmango 755

poj 2761 线段树(多次查询不覆盖区间的第k小数)

题意:给定n个数,m次查询(a,b,k),表示查询第a个数到第b个数(闭区间[a,b])中的第k小数。其中这m个区间保证没有一个完全覆盖另外一个。 思路:首先考虑没有区间覆盖的意思:对于最小的区间终点,它对应的起点一定是最小的区间起点。首先离散化。然后使用线段树,每个节点(如表示区间为[a,b])维护一个值small表示位于其左儿子的个数。然后对于每个区间(对区间先排序)更新查询即可。时间复杂度

dearmango 755

poj 1785 构造笛卡尔树(右链插入/RMQ)

题意:给定n个(label,priority)的二元组,以此构建笛卡尔树。所谓笛卡尔树(treap),看label为二叉排序树,而看priority为堆。 思路:(http://www.cnblogs.com/rainydays/archive/2011/06/15/2081266.html)先把节点按lable排序,从小到大依次插入,这样每次插入的节点就要插到排序二叉树的最右边。之前先建立一个

dearmango 742

poj 2481 树状数组(覆盖每个区间的区间个数)

题意:在数轴[0,100000]内给定n个区间,区间端点为整数。问对于每个区间,有多少个区间能够包含这个区间。如果两个区间端点全部相同不算包含,只有一个端点相同的属于包含关系。 思路:树状数组。按照终止节点从大到小排序,相同的则按照起始节点从小到大,目的使得只有前面的区间可能包含后面的区间。遍历n处理两种情况:1、区间的两端点都和上一个完全相同,则输出值也和上一个区间相同;2、如果不是,那么计算

dearmango 742

poj 2750 线段树(带更新的环形最大子序列)

题意:给定一个环形序列,可以进行在线操作,每次修改一个其中元素。每次修改之后立即输出环上的最大连续子序列的和,要求子序列的长度不得为n,也即不能是整个环。 思路:比较复杂的线段树(http://blog.youkuaiyun.com/non_cease/article/details/7437690)把环从一个地方切断拉成一条直线(最直观当然是从n~1之间切断),用线段树记录当前区间的非空最大子列和当前区间

dearmango 726
上一篇: poj 2513 trie树+欧拉路判断+并查集=(首尾相接的木棍)
下一篇: 如何判断一个正整数数x是否为2的幂
dumeichen
博客等级 码龄13年 55粉丝 475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值