算法
lllixingrui
这个作者很懒,什么都没留下…
展开
-
第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳) M题 题解
题目描述JB hates solving string problems. Therefore, when his friend Potato gives him a string problem to solve, he immediately gives it to you and continues playing Genshin Impact, the greatest game in the world.题意给一个字符串,输出每一字符的一个字典序最大的子串,这个子串以当前位置的字符结尾输入原创 2021-11-25 21:09:55 · 731 阅读 · 0 评论 -
求解子串匹配问题---hash算法
哈希算法就是把一个字符串用hash算法得到一个固定的值,再把其它串用同样的方法得到一个值,用二分查找的方式看看有没有一个同样的值,有就说明匹配到了hash算法模板#include<bits/stdc++.h>using namespace std;#define ull unsigned long longull base = 131;ull a[10010];char s[10010];int main(){int n;scanf("%d",&n);for(int原创 2021-11-11 21:33:08 · 270 阅读 · 0 评论 -
最短路的三种解法
最短路的三种解法1.单源最短路迪杰斯特拉(nn) 和 Spfa(nm)一般使用迪杰斯特拉+堆优化,时间复杂度为(n+m)log2n,但是只用于不含有负权的边的求解最短步骤:1.建立边,dis数组无穷化,dis[start]=0;2.优先队列加入边,当pr.dis != dis[pr.pos] 时continue,因为已经有更小的路径连接当前点了,所有不需要了3.更新dis,并且push进去优先队列排序的关键代码bool operator < (const node &x)co原创 2021-07-27 09:26:46 · 573 阅读 · 0 评论 -
通往奥格瑞玛的道路(二分+迪杰斯特拉堆优化)
题目背景在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量有一天他醒来后发现自己居然到了联盟的主城暴风城在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛题目描述在艾泽拉斯,有n个城市。编号为1,2,3,…,n。城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量。每次经过一个城市,都会被收取一定的过路费(包括起点和终点)。路上并没有收费站。假设1为暴风城,n为奥格瑞玛,而他的血量最多为b,出发时他的血量是满的。歪嘴哦不希望原创 2021-07-27 09:39:09 · 200 阅读 · 0 评论 -
洛谷P1119 灾后重建 Floyd
题目大意n个点,0到n-1,m条无向边,每个村庄都有一个重建好的时间,一建好,立刻通车,并且每个村庄重建好的时间时不递减的,现在给你q次询问,问x,y在时间t是否连通,若连同求出最短路径,并且t也是不下降的思路 由于n<=200且是多源问题,又是求最短路,所以使用Floyd算法,又因为村庄重建好的时间是不递减的,每次询问也是不递减的,我们每次询问的时候只需遍历更新当前询问时间段之前的点就可以了关键代码scanf("%d%d%d",&u,&v,&tt);while(t[原创 2021-07-27 10:07:15 · 129 阅读 · 0 评论 -
2021中国大学生程序设计竞赛 女生专场C题题解
思路:要求何寻找一个最短的 t,使得 t 不是 s(l,r) 的子序列,假设现在位于x,那么下一步有m个选择,我们要使得子序列尽可能的小,所以就要选择离x最远的那个字母,直到走出r为止。于是问题转化为:从 l 开始沿着 _next 一路往右跳,要跳多少步才能跳到 > r 的地方。求区间最值问题,使用st表,我们使用倍增的方法使得_next[i][j]: 是i从2^j步到达的最远位置。#include<bits/stdc++.h>using namespace std;char s[2原创 2021-11-05 19:58:42 · 474 阅读 · 0 评论 -
求解多字符串匹配问题---AC自动机算法
思路详解来自例题1:AC自动机模板#include <queue>#include <cstdlib>#include <cmath>#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long原创 2021-09-17 20:13:06 · 73 阅读 · 0 评论 -
求字符串匹配问题---Sunday算法
Sunday算法(字符串匹配)In abcde cdeOut The index is: 2#include<bits/stdc++.h>using namespace std;void SundayMatch(const char *src, const char *patt){//传入源串(长)与模板串(短) int slen = strlen(src);//得源串长 int plen = strlen(patt);//得模板串长 int shift[256];//位移标记原创 2021-08-19 16:59:35 · 186 阅读 · 0 评论 -
KMP算法用途
为什么要使用KMP算法?比KMP算法更优的算法有很多,解决文本串匹配问题,我自己选择KMP算法和Sunday算法但是KMP算法不仅可以解决文本串匹配问题,还可以解决由KMP算法的Next数组引出来的子问题1.求最小循环子串(即最长匹配长度(Next数组里面的符号就是表示当前位置与之前匹配过的文本的最长匹配长度))例如abcabca Next数组为 0 0 0 1 2 3 42.求字符串的最短匹配长度例如abababab Next数组为 0 0 1 2 1 2 1 2 1 2(思路)3.在文本原创 2021-08-19 16:57:18 · 1119 阅读 · 0 评论 -
求字符串(单词)在文本中出现与否和出现的次数---Trie树(字典树)算法
字典树模板字典树模板#include<bits/stdc++.h>#include<algorithm>using namespace std;inline int read();int next_[500000][26];//p[节点的数量][当前节点的分支数量]int f[500000];//表示是否以当前节点结尾char s[30];//词组int cnt=0;//节点的个数void insert_(int len,int n){//插入当前单词int n原创 2021-08-17 09:08:11 · 169 阅读 · 0 评论 -
求解最长回文子串---manacher算法
manacher求解最长回文子串#include<bits/stdc++.h>using namespace std;char ss[11000100];char s[22000100];int p[22000100];int manacher(int n){int mid=1,mr=1,ans=-1;for(int i=1;i<=n;i++){ if(i<mr){ p[i]=min(mr-i,p[mid*2-i]);//当当前的位置小于处理过原创 2021-08-09 15:56:39 · 178 阅读 · 0 评论 -
求解字符串匹配问题---KMP算法
模式串匹配,给定一个需要处理的文本串和一个需要再文本串中搜索的模式串,查询再该文本串中,给出的模式串的出现有无,次数,位置等KMP的精髓在于,对于每次匹配失败后,我们都不会重新开始枚举,而是根据我们已经得知的数据,从某个特定的位置开始匹配,对于模式串的每一个,都有唯一的"特定变化位置",在这个匹配失败后的特定变化位置可以帮助我们利用已有的数据不用从头匹配,从而节约时间要求KMP我们有两个步骤1.求模式串的next数组void getnext(){int lenss=strlen(ss);int原创 2021-08-06 09:19:12 · 325 阅读 · 0 评论 -
数字统计,统计在1到n之间2出现的次数
数字统计,统计在1到n之间2出现的次数我的思路是把这个数从右往左进行判断,即从个位往最高位判断我们假设一个数1234个位,把它分为1-1230 ,和 1231-1234个位出现次数为: 1231 + 1十位,分为1-1200,和 1201-1234十位出现次数为: 1210 + 10百位,分为1-1000 和 1001-1234百位出现的次数为:1100 + 35千位分为 null 和1-1234千位出现的次数为:01000 + 0res = 389#include<bits/原创 2021-07-29 16:03:50 · 1212 阅读 · 0 评论