回文匹配
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #include <bits/stdc++.h> |
| using namespace std; |
| const int M=3e6+5; |
| #define int unsigned int |
| |
| int ne[M]; |
| void kmp(string s,int n) { |
| for(int i=2,j=0;i<=n;i++) { |
| while(j&&s[i]!=s[j+1])j=ne[j]; |
| if(s[i]==s[j+1])j++; |
| ne[i]=j; |
| } |
| } |
| |
| int sum[M]; |
| void find(string s,int n,string t,int m) { |
| for(int i=1,j=0;i<=n;i++) { |
| while(j&&s[i]!=t[j+1])j=ne[j]; |
| if(s[i]==t[j+1])j++; |
| if(j==m) { |
| sum[i-j+1]=1; |
| j=ne[j]; |
| } |
| } |
| } |
| |
| int p[M]; |
| void manacher(string s,int n) { |
| s.push_back('@'); |
| for(int i=1,mid=0,r=0;i<=n;i++) { |
| if(i<=r)p[i]=min(p[2*mid-i],r-i+1); |
| while(s[i-p[i]]==s[i+p[i]])p[i]++; |
| if(i+p[i]-1>r)mid=i,r=i+p[i]-1; |
| } |
| } |
| |
| signed main() { |
| int n,m; |
| cin>>n>>m; |
| string s1,s2; |
| cin>>s1>>s2; |
| s1=' '+s1,s2=' '+s2; |
| kmp(s2,m); |
| find(s1,n,s2,m); |
| for(int i=1;i<=n;i++)sum[i]+=sum[i-1]; |
| for(int i=1;i<=n;i++)sum[i]+=sum[i-1]; |
| manacher(s1,n); |
| int ans=0; |
| for(int i=1;i<=n;i++) { |
| if(2*p[i]-1<m)continue; |
| int r=i+p[i]-1,l=i-p[i]+1; |
| l--;r=r-m+1; |
| int mid=(l+r)/2; |
| |
| ans+=sum[r]-sum[mid]-sum[((l+r)&1)?mid:mid-1]+sum[l==0?l:l-1]; |
| } |
| cout<<ans<<endl; |
| return 0; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现