目录

算法学习​​​​​​​

1.字典树的应用

2.Barn Echoes G

归并排列模板


算法学习

 1.字典树的应用P2580 于是他错误的点名开始了 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P2580


建立字典树:

1.初始化及变量设置: 

i 用于for读取字符串str中的每个字符;

可指代字符(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 +归并排序模板相关推荐

  1. 一对一视频聊天app源码,归并排序模板

    一对一视频聊天app源码,归并排序模板实现的相关代码 #include<iostream> using namespace std; const int N=1e5+10; int a[N ...

  2. 归并排序模板(附求逆序对)

    逆序对满足两个条件, i < j 和 ai > aj 归并可以求逆序对, 因为是按顺序加入, 所以右区间加入的时候, 左区间的数满足 i < j, 然后左边还没有加入的数肯定比当前的 ...

  3. 逆序对的数量(归并排序模板y神)

    #include<iostream> using namespace std; typedef long long LL; const int N = 100010; int n; int ...

  4. 丘比特射箭时为何要蒙上眼睛?

    为什么丘比特射箭的时候需要蒙着眼睛,而不是睁开眼睛,对着帅哥美女biu biu biu~ 那为什么丘比特必须蒙着眼睛,正义女神必须看不见? 查看全文 http://www.taodudu.cc/new ...

  5. Golang实现发送微信公众号模板消息(每日一句和天气预报)

    Golang实现发送微信模板消息(每日一句和天气预报) 前言 本文是基于https://www.cnblogs.com/connect/p/python-wechat-iciba.html 这篇博客写 ...

  6. 逆序对个数(归并排序)

    数对 (归并排序) 题目链接:https://ac.nowcoder.com/acm/contest/27274/H 来源:牛客网 Problem Description 链接:https://ac. ...

  7. freamarker 模板中空格_高端商务公司介绍PPT模板

    每日免费-每天分享一套精美模板,建议大家将"老油条PPT"设置为置顶. 本套模板免费获取方式: 关注"老油条PPT"公众号获取下载链接.链接只有24小时有效,逾 ...

  8. POJ3067 Japan(归并排序)

    题意: 日本西海岸有n座城市,东海岸m座城市.现在要在两个海岸的城市之间建高速公路,问有几个相交点. 要点: 对Ax,Ay和Bx,By两条高速公路,有相交点必须(Ax-Bx)*(Ay-By)<0 ...

  9. python 自动复制分类_leetcode python 常见分类问题模板(复制粘贴就能用) 更新中......

    排序 插入.希尔.冒泡.选择 def insertSort(arr): for i in range(1,len(arr)): tmp = arr[i] for j in range(i-1,-1,- ...

最新文章

  1. CSS 实例之打开大门
  2. linux命令 pushd和popd
  3. 用筛选法求100以内的素数(数组)
  4. 一招彻底破除数据孤岛!这家企业用数据集市整合了30套系统
  5. Android4.0 添加一个新的Android 键值
  6. One-Error多标签分类_深度学习:如何在多标签分类问题中考虑标签间的相关性?
  7. AcWing 869. 试除法求约数(枚举)
  8. 拓端tecdat|R语言广义线性模型(GLMs)算法和零膨胀模型分析
  9. 求边长为一的正方体中,面对角线组成的正四面体体积.
  10. Java NIO初试
  11. 数字锁相ud,uq的关系
  12. java实现根据高德地图API接口进行地址位置解析,将地址转化为经纬度
  13. SOT-23三极管、MOS管、LDO封装对应图汇总
  14. 盲盒app源码,可搭建部署二开.模式功能介绍.
  15. 解决go数据表查询结构体对应字段null问题(sqlx converting NULL to string is unsupported)
  16. css3 - 图标元素动画效果3 - 图标整体在Y轴上移
  17. 运放电压和电流负反馈的讨论
  18. HTML JavaScript
  19. 小程序开发之组件的使用
  20. QT当中的【QSetting和.ini配置文件】以及【创建Resources.qrc】

热门文章

  1. 基于python的排课表系统_利用python爬取广西科技大学教务管理信息系统班级课表...
  2. 世界上最短的DVD解码程序
  3. 四个层面解析阿里云云市场生态建设之路
  4. 高分红背后,华宝股份如何谋得出路?
  5. [转载]用latex写毕业论文
  6. Linux - grep -正则表达式
  7. 桶排序 (详细图解)
  8. 三菱socket通信实例_Delphi與三菱QCPU PLC通信控制(Winsocket篇) @ 非常低調(也談PLC) :: 隨意窩 Xuite日誌...
  9. 如何写CRM需求——客户服务管理篇
  10. Android模仿微信录制小视频