当前位置: 首页 > news >正文

哈希 kmp trie树

哈希 kmp trie树

哈希

定义

image
hash方式

image

hash公式

image

单hash方法

image

image

双hash方法

image

获取子串的hash

image

代码

#include<bits/stdc++.h>
using namespace std;
char s1[1000010],s2[1000010];
unsigned h2[1000010],p2[1000010];
unsigned long long h1[1000010],p1[1000010];
unsigned g1(int l,int r)
{return h1[r]-h1[l-1]*p1[r-l+1];
}
unsigned g2(int l,int r)
{return h2[r]-h2[l-1]*p2[r-l+1];
}
int main()
{int t;cin>>t;p1[0]=1;p2[0]=1;for(int i=1;i<=1000000;i++){p1[i]=p1[i-1]*13331;p2[i]=p2[i-1]*13331;}while(t--){cin>>s1>>s2;int len1=strlen(s1); int len2=strlen(s2); unsigned h1a=0,h2a=0;for(int i=0;i<len1;i++){h1a=h1a*13331+s1[i];h2a=h2a*13331+s1[i]; }for(int i=0;i<len2;i++){h1[i+1]=h1[i]*13331+s2[i];h2[i+1]=h2[i]*13331+s2[i]; }int ans=0;for(int i=1;i+len1-1<=len2;i++){if(g1(i,i+len1-1)==h1a&&g2(i,i+len1-1)==h2a){ans++;}}cout<<ans<<endl;}return 0;
}

kmp
image

image

image

image

image

image

image

image

image

image

kmp优化

image

image

image
代码

#include<bits/stdc++.h>
using namespace std;
int nxt[400010];
bool ans[400010];
int main()
{string s;while(cin>>s){memset(nxt,-1,sizeof(nxt));memset(ans,0,sizeof(ans));int m=s.size();for(int i=1,j=-1;i<m;i++){while(j>-1&&s[i]!=s[j+1]) {j=nxt[j];}if(s[i]==s[j + 1]){j++;} nxt[i]=j;}int x=nxt[m-1];ans[m]=1;while(x!=-1){ans[x+1]=1;x=nxt[x];}if(s[0]==s[m-1]){ans[1]=1;}for(int i=1;i<=m;i++){if(ans[i]==1){cout<<i<<" "; }}cout<<endl;}return 0;
}

trie 树

image

image

代码

#include<bits/stdc++.h>
using namespace std;
int n;
int Trie[2010000][50],tot=1,ed[2010000];
string ss[2000100];
void insert(string str)	
{int len=str.size(),p=1;for(int i=0;i<len;i++){int ch=str[i]-'0';if(Trie[p][ch]==0){tot++;Trie[p][ch]=tot;}ed[p]=0;p=Trie[p][ch];}if(ed[p]!=0){ed[p]=1;}
}
int search(string str)	
{int len=str.size(),p=1;for(int i=0;i<len;i++){p = Trie[p][str[i]-'0'];if(p==0){return 0;}}return ed[p];
}
int main()
{int t;cin>>t;while(t--){cin>>n;memset(ed,2,sizeof(ed));for(int i=1;i<=n;i++){string s;cin>>s;insert(s);ss[i]=s;}for(int i=1;i<=n;i++){if(search(ss[i])==0){cout<<"NO"<<endl;break;}if(i==n){cout<<"YES"<<endl;}}}return 0;
}

\({\cal {The }}\) \({\cal {end. }}\)

http://www.kefakeji.com/news/904.html

相关文章:

  • 多语言ppt改进
  • day30
  • redis的过期时间算法为什么要使用最小堆来实现时间轮,为什么不使用一个循环数组作为核心数据结构(ds)
  • 读心与芯:我们与机器人的无限未来07机器人的风险
  • 多项式 - 生成函数
  • 图灵奖和诺贝尔奖双料得主、AI教父Hinton:AI超越人类后,我们该怎么做
  • ICCV 2025 | 浙大等提出 SGCDet:自适应3D体素构建,重新定义多视图室内3D检测
  • 国产GPU芯片的天花板来啦!打破一切质疑,现场4K全高画质流畅跑黑猴!!!
  • 当AI教父都开始害怕AI
  • 共生伙伴:2025人工智能十大趋势|2025 WAIC报告重磅发布
  • 数据泄露激增与防护策略详解
  • 20250728
  • 白话Docker系列(一):用Web应用实例深入容器
  • 用 Vite + Cloudflare Pages 实现模块级独立打包与部署的静态 CDN 分发
  • [07.27学习笔记] Tokenizer - Luna
  • STM32F103C8T6芯片介绍(下) - LI,Yi
  • GRUB 设置安全启动
  • 【work记录】系统能力大赛数据库中的MVCC学习记录
  • FireStore如何查看空间占用情况?(未解决)
  • MIT6.s081_Lab8
  • 关于同源策略和跨域请求
  • Codeforces Round 1039 (Div. 2) 1 ~ D
  • 【转】[C#] 参数前加 in 的作用
  • 循环链表实现的队列
  • Codeforces Round 1039 (Div. 2)(A~E1)
  • 关于博客主题的一些思考
  • PG故障处理:PG_AUTO_FAILOVER自动切换失败的故障处理
  • Codeforces Round 1039 (Div. 2)
  • 21天
  • 【转】[C#] Enum 的 Flags 特性