每日总结之kmphash 3.2 +归并排序模板
目录
算法学习
1.字典树的应用
2.Barn Echoes G
归并排列模板
算法学习
1.字典树的应用P2580 于是他错误的点名开始了 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P2580
建立字典树:
1.初始化及变量设置:
i 用于for读取字符串str中的每个字符;
t 可指代字符(int);
k 代表层数,cnt 为层数中间量;
a【k】【t】二维数组用于存储字典树:第k层第t个字符,a[][]表示层数+1(含叶子)
tail【k】=1 一维数组用于记录第k层为1(叶子),从第0层开始记录的;
2. char 转化为 int:t=str[ i ]-'a';
3.构造每层枝干:如果该层没出现过,加入编号++cnt,构造下一层;
4.进入下一层 k =a[ k ][ t ];此时a[ i ][ j ]的值为cnt(层数);
5.添加叶子:一个字符串为一个子树,tail [ k ]=1;即尾部 tail叶子,告知某一字符串已遍历完成;
查询字典树:
1.读入需查询的字符串:找出对应在字典树中的位置;
2.查询:if(k==0)即为空,break;
3.次数+1:if(tail[k]==1) tail[k]++;
#include <string.h>
#include <stdio.h>
int main()
{int a[1000010][26]={0},n,cnt=0,m,tail[1000010]={0}; //tail数组用来存储叶子char str[55];scanf("%d",&n); //输入字典树while(n--){scanf("%s",str);int k=0;for(int i=0;str[i];i++){int temp=str[i]-'a'; //char转化为intif(a[k][temp]==0) //该层没出现过该字符{cnt++;a[k][temp]=cnt; //加入编号}k=a[k][temp]; //下一层}tail[k]=1; //尾部设置为1}scanf("%d",&m); //查询字典树while(m--){scanf("%s",str);int k=0; //初始化,每个名字从头开始寻找for(int i=0;str[i];i++){int temp=str[i]-'a';k=a[k][temp]; //找下一层if(k==0)break; //为空,查询结束}if(tail[k]==1) //第一次{tail[k]++; //次数+1,当下次查询到tail[k]时即为2;printf("OK\n");}else if(tail[k]>1) //重复{printf("REPEAT\n");}else printf("WRONG\n"); //tail[k]=0}return 0;
}
2.Barn Echoes G
题意:
第一个串的最后的部份"yzooo"跟第二个串的第一部份重复。第二个串的最后的部份"mo"跟第一个串的第一部份重复。
所以"yzooo"跟"mo"都是这2个串的重复部份。其中,"yzooo"比较长,所以最长的重复部份的长度就是5。
P2957 [USACO09OCT]Barn Echoes G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P2957
1.题意:①第一个字符串的前缀==第二个字符串的后缀 ②第一个字符串的后缀==第二个字符串的前缀,取两者的最大长度max;
2.关键:同时,遍历第一个字符串的每个前缀,遍历第二个字符串的每个后缀,找相同hash值一样即为解;
3.hash参量设置:s【】需转换的字符串,left 字符串的左端,right 字符串的右端;
#include<stdio.h>
#include<string.h>
#include<math.h>char a[100],b[100];
typedef long long ll;
ll mod=pow(2,62); //模
ll x=133333331; //进制 long long hash(char s[],long long left,long long right) //判断两个字符串,前缀和后缀相等的最大长度max
{long long sum=0;for(long long i=left; i<right; i++)sum=(sum*x+(ll)s[i])%mod;return sum;
}long long max(long long a,long long b)
{return a>b?a:b;
}int main()
{long long i,j,len1,len2,maxx=0;scanf("%s %s",a,b);len1=strlen(a);len2=strlen(b);for(i=0,j=len2-1; i<len1,j>=0; i++,j--) //第一个字符串的前缀==第二个字符串的后缀{if(hash(a,0,i)==hash(b,j,len2-1)) //第一个字符串前缀++,第二个字符串后缀-- maxx=max(maxx,i+1); }for(i=len1-1,j=0; i>=0,j<len2; i--,j++) //第一个字符串的后缀==第二个字符串的前缀{if(hash(a,i,len1-1)==hash(b,0,j)) //第一个字符串前缀++,第二个字符串后缀-- maxx=max(maxx,j+1);}printf("%lld",maxx);return 0;
}
归并排列模板
1.终止条件:l>=r
2.递归左,右边(分治):sort(q,l,mid) (q,mid+1,r)
3.比大小,存入中间数组:将一个数组一分为二,两两指针比较,把小的值先存入
4.扫尾
5.物归原主
void merge_sort(int q[],int l,int r)
{int tmp[100];if(l>=r) return ;int mid = (l+r)/2;merge_sort(q,l,mid); //对左边进行递归排序merge_sort(q,mid+1,r); //对右边进行递归排序int k = 0; int i = l, j = mid + 1;while(i <= mid&&j <= r){if(q[i]<=q[j]) tmp[k++] = q[i++];//将一个数组一分为二,两两指针比较,把小的值先存入tmp【】数组else tmp[k++] = q[j++];}while(i <= mid)tmp[k++] = q[i++]; //扫尾while(j <= r) //扫尾tmp[k++]=q[j++];for(i = l,j = 0; i<= r; i++,j++) //还原,物归原主q[i]=tmp[j];
}
每日总结之kmphash 3.2 +归并排序模板相关推荐
- 一对一视频聊天app源码,归并排序模板
一对一视频聊天app源码,归并排序模板实现的相关代码 #include<iostream> using namespace std; const int N=1e5+10; int a[N ...
- 归并排序模板(附求逆序对)
逆序对满足两个条件, i < j 和 ai > aj 归并可以求逆序对, 因为是按顺序加入, 所以右区间加入的时候, 左区间的数满足 i < j, 然后左边还没有加入的数肯定比当前的 ...
- 逆序对的数量(归并排序模板y神)
#include<iostream> using namespace std; typedef long long LL; const int N = 100010; int n; int ...
- 丘比特射箭时为何要蒙上眼睛?
为什么丘比特射箭的时候需要蒙着眼睛,而不是睁开眼睛,对着帅哥美女biu biu biu~ 那为什么丘比特必须蒙着眼睛,正义女神必须看不见? 查看全文 http://www.taodudu.cc/new ...
- Golang实现发送微信公众号模板消息(每日一句和天气预报)
Golang实现发送微信模板消息(每日一句和天气预报) 前言 本文是基于https://www.cnblogs.com/connect/p/python-wechat-iciba.html 这篇博客写 ...
- 逆序对个数(归并排序)
数对 (归并排序) 题目链接:https://ac.nowcoder.com/acm/contest/27274/H 来源:牛客网 Problem Description 链接:https://ac. ...
- freamarker 模板中空格_高端商务公司介绍PPT模板
每日免费-每天分享一套精美模板,建议大家将"老油条PPT"设置为置顶. 本套模板免费获取方式: 关注"老油条PPT"公众号获取下载链接.链接只有24小时有效,逾 ...
- POJ3067 Japan(归并排序)
题意: 日本西海岸有n座城市,东海岸m座城市.现在要在两个海岸的城市之间建高速公路,问有几个相交点. 要点: 对Ax,Ay和Bx,By两条高速公路,有相交点必须(Ax-Bx)*(Ay-By)<0 ...
- python 自动复制分类_leetcode python 常见分类问题模板(复制粘贴就能用) 更新中......
排序 插入.希尔.冒泡.选择 def insertSort(arr): for i in range(1,len(arr)): tmp = arr[i] for j in range(i-1,-1,- ...
最新文章
- CSS 实例之打开大门
- linux命令 pushd和popd
- 用筛选法求100以内的素数(数组)
- 一招彻底破除数据孤岛!这家企业用数据集市整合了30套系统
- Android4.0 添加一个新的Android 键值
- One-Error多标签分类_深度学习:如何在多标签分类问题中考虑标签间的相关性?
- AcWing 869. 试除法求约数(枚举)
- 拓端tecdat|R语言广义线性模型(GLMs)算法和零膨胀模型分析
- 求边长为一的正方体中,面对角线组成的正四面体体积.
- Java NIO初试
- 数字锁相ud,uq的关系
- java实现根据高德地图API接口进行地址位置解析,将地址转化为经纬度
- SOT-23三极管、MOS管、LDO封装对应图汇总
- 盲盒app源码,可搭建部署二开.模式功能介绍.
- 解决go数据表查询结构体对应字段null问题(sqlx converting NULL to string is unsupported)
- css3 - 图标元素动画效果3 - 图标整体在Y轴上移
- 运放电压和电流负反馈的讨论
- HTML JavaScript
- 小程序开发之组件的使用
- QT当中的【QSetting和.ini配置文件】以及【创建Resources.qrc】
热门文章
- 基于python的排课表系统_利用python爬取广西科技大学教务管理信息系统班级课表...
- 世界上最短的DVD解码程序
- 四个层面解析阿里云云市场生态建设之路
- 高分红背后,华宝股份如何谋得出路?
- [转载]用latex写毕业论文
- Linux - grep -正则表达式
- 桶排序 (详细图解)
- 三菱socket通信实例_Delphi與三菱QCPU PLC通信控制(Winsocket篇) @ 非常低調(也談PLC) :: 隨意窩 Xuite日誌...
- 如何写CRM需求——客户服务管理篇
- Android模仿微信录制小视频