算法模板——哈希单模板字符串匹配
实现功能:第一行输入模板串;第二行输入N;接下来N行每行一个字符串,将每个字符串中出现的模板串的起始位置找出
原理:字符串双值哈希啦啦啦,和KMP其实差不太多,但是字符串双值哈希绝对是个字符串题乱搞神器!!!
1 const pa=314159;pb=951413; 2 var 3 i,j,k,l,m,n:longint; 4 ap,bp:array[0..100000] of int64; 5 ma,mb,va,vb:int64; 6 s1,s2,s3:ansistring; 7 begin 8 ap[0]:=1;bp[0]:=1; 9 for i:=1 to 100000 do 10 begin 11 ap[i]:=(ap[i-1]*pa) mod pb; 12 bp[i]:=(bp[i-1]*pb) mod pa; 13 end; 14 readln(s1); 15 ma:=0;mb:=0; 16 for i:=1 to length(s1) do 17 begin 18 ma:=(ma+ord(s1[i])*ap[i]) mod pb; 19 mb:=(mb+ord(s1[i])*bp[i]) mod pa; 20 end; 21 readln(n); 22 for j:=1 to n do 23 begin 24 readln(s2); 25 if length(s2)<length(s1) then continue; 26 va:=0;vb:=0; 27 for i:=0 to length(s1)-1 do 28 begin 29 va:=(va+ord(s2[i])*ap[i]) mod pb; 30 vb:=(vb+ord(s2[i])*bp[i]) mod pa; 31 end; 32 for i:=length(s1) to length(s2) do 33 begin 34 va:=(va-ord(s2[i-length(s1)])*ap[i-length(s1)]+ord(s2[i])*ap[i]) mod pb; 35 va:=(va+(abs(va) div pb+1)*pb) mod pb; 36 vb:=(vb-ord(s2[i-length(s1)])*bp[i-length(s1)]+ord(s2[i])*bp[i]) mod pa; 37 vb:=(vb+(abs(vb) div pa+1)*pa) mod pa; 38 if (((ma*ap[i-length(s1)]) mod pb)=va) and (((mb*bp[i-length(s1)]) mod pa)=vb) then write(i-length(s1)+1,' '); 39 end; 40 writeln; 41 end; 42 end.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)