poj3461 KMP模板 或 哈希
来源:互联网 发布:linux的w命令 编辑:程序博客网 时间:2024/06/07 01:57
kmp模板题,也可用哈希
kmp版
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cstdlib>#include<cmath>#include<ctime>#include<algorithm>#include<iomanip>#include<cctype>#include<queue>using namespace std;const int N=1e6+5;char s[N],t[N];int sn,tn,bz=1,next[N];void getnext(){ for(int i=1,j=0;i<tn;i++) { while(j&&t[i]!=t[j])j=next[j-1]; if(t[i]==t[j])j++; next[i]=j; }}void kmp(){ for(int i=0,j=0;i<sn;i++) { while(j&&s[i]!=t[j])j=next[j-1]; if(s[i]==t[j])j++; if(j==tn) { bz=0; cout<<i-tn+2<<'\n'; } }}int main(){ //freopen("lx.in","r",stdin); scanf("%s%s",s,t); sn=strlen(s),tn=strlen(t); getnext(); kmp(); if(bz)cout<<"NO"; return 0;}
哈希版(unsigned long long会自然溢出,相当于mod一个数,所以基数可用适当大的素数避免冲突)
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;const int N=1e6+5,base=61;char s[N],t[N];int sn,tn;unsigned long long num,bin[N],hash[N];int main(){ //freopen("lx.in","r",stdin); scanf("%s%s",s+1,t+1); sn=strlen(s+1),tn=strlen(t+1); for(int i=tn;i>=1;i--)num=num*base+t[i]-'a'; for(int i=sn;i>=1;i--)hash[i]=hash[i+1]*base+s[i]-'a'; bin[0]=1; for(int i=1;i<=tn;i++)bin[i]=bin[i-1]*base; int bz=1; for(int i=1;i<=sn-tn+1;i++) { if(hash[i]-hash[i+tn]*bin[tn]==num) { bz=0; cout<<i<<endl; } } if(bz)cout<<"NO"; return 0; }
阅读全文
0 0
- poj3461 KMP模板 或 哈希
- poj3461 kmp 模板题
- poj3461 KMP模板题
- poj3461 kmp模板题
- POJ3461 【KMP(粗糙模板)】
- [模板]kmp[poj3461][codevs5757]
- POJ3461 Oulipo KMP模板
- KMP算法模板+POJ3461实现
- POJ3461(KMP模板题)
- POJ3461(KMP模板题)
- poj3461 (裸kmp)kmp模板
- kmp模板---poj3461
- poj3461(KMP)
- POJ3461 KMP
- KMP+poj3461
- poj3461 KMP
- poj3461 KMP
- poj3461 KMP
- 暑期学习记录02
- ViewPager的 setOffscreenPageLimit(0) 方法
- 如何在Android中使用Realm数据库
- 【笔记】Java 文档注释
- 如何提升产品经理的会议沟通效率?
- poj3461 KMP模板 或 哈希
- 实现二分查找
- I
- 同余定理 应用于大整数取模
- 对象和类
- 关于ElasticSearch 5.X分词器的问题
- iOS-禁用TextField的粘贴、拷贝等功能
- J
- kaggle比赛之路(一) —— 新手注册账号并fork一个notebook