KMP+Tire树(模板)
2024-08-26 03:43:02
\(\color{Red}{KMP板子}\)
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+9;
int la,lb,j,kmp[maxn];
char a[maxn],b[maxn];
int main()
{
cin>>a+1>>b+1;
la=strlen(a+1),lb=strlen(b+1);
for(int i=2;i<=lb;i++)//第一为默认为0
{
while(j&&b[i]!=b[j+1]) j=kmp[j];
//ABCA的相同前后缀是A,如果想再增加
//必须再添加一个B,也就是b[j+1]位置要等于b[i]
if(b[j+1]==b[i]) j++;
kmp[i]=j;
}
j=0;
for(int i=1;i<=la;i++)
{
while(j&&b[j+1]!=a[i]) j=kmp[j];
if(b[j+1]==a[i]) j++;
if(j==lb)
{
cout<<i-lb+1<<endl;
j=kmp[j];//找到后开始找下一个
}
}
for(int i=1;i<=lb;i++) cout<<kmp[i]<<" ";
}
\(\color{Red}{Tire树板子}\)
struct node{
int zi[27];
}tire[maxn];int isok[maxn],tot;
void insert(string s)
{
int now=0,len=s.length();
for(int i=0;i<len;i++)
{
int ch=s[i]-'a'+1;
if(!tire[now].zi[ch])
tire[now].zi[ch]=++tot;
now=tire[now].zi[ch];
}
isok[now]=1;//此节点是一个字串
}
bool ask(string s)
{
int now=0,len=s.length();
for(int i=0;i<len;i++)
{
int ch=s[i]-'a'+1;
if(!tire[now].zi[ch]) return false;
now=tire[now].zi[ch];
}
return true;
}
最新文章
- 在Windows上安装Elasticsearch 5.0
- c++中的内存空间不足和自定义处理内存不足
- XmlReader读取XML
- 【HDU】2147 kiki&#39;s game
- 有些网站为什么要使用CDN,CDN又是什么呢
- 剑指架构师系列-Struts2的缓存
- 《redis-php中文参考手册》
- CodeForces 429 B B. Working out
- oracle数据库驱动(ojdbc)
- View的getMeasuredWidth和getWidth有什么区别?
- Apache 和 Tomcat联系和区别
- 2016年3月9日Android实习日记
- PHP测试Mysql数据库连接
- 委托 匿名 lambda表达式
- PHP 数据运算类型都有哪些?
- C++获取文件夹下所有文件名
- 20145127 《Java程序设计》第四次实验报告
- MVC3控制器方法获取Form数据方法
- ORM(Object Relational Mapping)框架
- UML类图简单说明,学习编程思路的必会技能
热门文章
- python-从酷狗下载爬取自己想要的音乐-可以直接拿来体验哟
- leetcode Perform String Shifts
- 自己总结 :并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别 和 使用场景总结
- Java类锁和对象锁实践和内部私有锁关联
- [转] [知乎] Roguelite 和 Roguelike 的区别是什么?
- Git敏捷开发--stash命令
- C++ 11 +,开坑。
- 简单了解下CAP定理与BASE定理
- 全国315个城市,用python爬取肯德基老爷爷的店面信息
- java 8 stream中的Spliterator简介