灵魂滚烫, 命运冰凉|

fhq_treap

园龄:5年7个月粉丝:67关注:21

[学习笔记]基础字符串算法

这里使用“基础”仅代表整合一些篇幅小的算法与后续几篇大的字符串算法文章区别。

留给自己补科技树的时间越来越短了。

字符串哈希

容易实现,可以快速比对两个串是否相等。

一般可以使用自然溢出Hash

注意使用非自然溢出时,应当把膜数取比字符串数量高一个数量级的质数。

最小循环表示法

考虑有SAM构建的做法。

我们这里有一个简单做法,定义两个指针i=1,j=2

两个指针不断向后匹配,直到两个字符不相等,假设前面相等的长度为k,如果s[i+k]<s[j+k],则j=j+k+1,否则i=i+k+1,如果上述操作之后两个数相等,则强制一个向后移动。
具体实现则是:

点击查看代码
	scanf("%lld",&n);
	for(int i = 1;i <= n;++i)
	scanf("%lld",&a[i]);
	for(int i = n + 1;i <= 2 * n;++i)
	a[i] = a[i - n];
	int j = 1,i = 2,k,tmp;
	while(i <= n){
		k = 0;
		while(a[i + k] == a[j + k])
		k += 1;
		if(a[i + k] < a[j + k])
		tmp = i,i = std::max(i + 1,j + k + 1),j = tmp;
		else
		i = i + k + 1;
	}
	for(int l = 1;l <= n;++l)
	std::cout<<a[j + l - 1]<<" ";
}

KMP 算法

现在看KMP就觉得有新的理解。
我们现在发现求出的next实际是最长的border。

AC自动机

考虑实际上是在Trie上构建最长border树。

有三类题目:
首先是直接在自动机上匹配的问题。
第二类是在AC自动机上dp,这类问题是强制不能出现或者一定出现的题,可以直接在Trie图上跑,并记录状态即可。
第三类题目即使用fail树,其关键性质是所有有S作为子串的串都在其子树内,有意思的题即我前几天写的Salieri

本文作者:fhq_treap

本文链接:https://www.cnblogs.com/dixiao/p/15918429.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   fhq_treap  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起