万能的哈希
本章节将介绍哈希如何实现 KMP 与 manacher。
KMP
我们对于文本串
然后遍历
跑得飞快,复杂度碾压 KMP 好不好~
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int maxn=1e6+10;
char s[maxn],t[maxn];
int n,m,ans;
int hat,has[maxn],p[maxn]={1};
int work(int l,int r)
{
return has[r]-has[l-1]*p[r-l+1];
}
signed main()
{
cin>>(s+1)>>(t+1);
n=strlen(s+1),m=strlen(t+1);
for(int i=1;i<=n;i++)
{
has[i]=has[i-1]*131+(s[i]-'0');
p[i]=p[i-1]*131;
}
for(int i=1;i<=m;i++)hat=hat*131+(t[i]-'0');
for(int l=1;l<=n-m+1;l++)
{
int r=l+m-1;
if(work(l,r)==hat)ans++;
}
cout<<ans;
return 0;
}
manacher
设原字符串为
朴素做法是
考虑设
所以就找到以
最后遍历
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int maxn=1.1e7+10;
char s[maxn];
int n,fr[maxn],en[maxn],p[maxn];
int dp[maxn];
bool check(int l,int r)
{
int get1=fr[r]-fr[l-1]*p[r-l+1];
int get2=en[l]-en[r+1]*p[r-l+1];
return get1==get2;
}
signed main()
{
cin>>(s+1);
n=strlen(s+1);p[0]=1;
for(int i=1;i<=n;i++){fr[i]=fr[i-1]*171+(s[i]-'0');p[i]=p[i-1]*171;}
for(int i=n;i>=1;i--){en[i]=en[i+1]*171+(s[i]-'0');}
dp[1]=1;dp[2]=(s[1]==s[2]?2:1);
for(int r=3;r<=n;r++)
{
int l=r-dp[r-1];
if(l!=1)l--;
while(l<r)
{
if(check(l,r))break;
l++;
}
dp[r]=r-l+1;
}
int ans=0;
for(int i=1;i<=n;i++)ans=max(ans,dp[i]);
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】