字符串哈希的本质就是一个用数字表示一段字符串,从而降低字符串处理的复杂度,这个数字我们一般用long类型,同时需要一个进制数base,用于规定这个数字的进制,Hash数组h[i]表示字符串s[1~i]的Hash值,采用类似前缀和的形式求出任意一个子串的哈希值,具体的原理大致就是这样,我也不细说了,我主要写模板。
import java.math.BigInteger; import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); //输入的字符串都是大写字母 char[] c1=scanner.next().toCharArray(); char[] c2=scanner.next().toCharArray(); //表示的是c1在c2中出现的次数 int n=c1.length; int m=c2.length; long[] h=new long[m+1];//h[i]表示第i处的哈希值 long[] b=new long[m+1];//表示的以base为底的i次方 long base=131; long res=0;//c1的哈希值 //计算c1的哈希值 for(int i=0;i<n;i++){ res=res*base+(c1[i]-'A'+1); } b[0]=1; //计算c2的字母哈希值 for(int i=1;i<=m;i++){ h[i]=h[i-1]*base+c2[i-1]-'A'+1; b[i]=b[i-1]*base; } int ans=0;//记录c1在c2中出现的次数 for(int i=1;i+n-1<=m;i++){ long sum=h[i+n-1]-h[i-1]*b[n]; if(sum==res)ans++; } System.out.println(ans); } }
题目链接:斤斤计较的小z(样例二是错的)