RABIN_KARP_MATCHER

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
struct data{ char ch[1002];};
data ch1,ch2;
int s1=0,s2=0,l1,l2,h=1;
const int d=26,p=10000007;
bool check(data ch1,data ch2,int x){
for (int j=0;j<l2;j++) if (ch1.ch[j+x]!=ch2.ch[j]) return 0;
    return 1;
}


void RABIN_KARP_MATCHER(data ch1,data ch2){
l1=strlen(ch1.ch),l2=strlen(ch2.ch);
for (int i=1;i<l2;i++) h=(h*d)%p;
for (int i=0;i<l2;i++){
s1=(d*s1+ch1.ch[i]-96)%p;
s2=(d*s2+ch2.ch[i]-96)%p;
}
for (int i=0;i<=l1-l2;i++){
 if (s1==s2&&check(ch1,ch2,i)) printf("%d ",i+1);
 //cout<<s1<<" "<<s2<<endl;
 if (i<l1-l2) s1=(long long)((d*(s1-h*(ch1.ch[i]-96))+ch1.ch[i+l2]-96)%p+p)%p;}
}


int main(){
scanf("%s\n%s",&ch1.ch,&ch2.ch);
RABIN_KARP_MATCHER(ch1,ch2);
return 0;

}

字符串的事情总是令人讨厌,几个关键点:1.字符串hash的应用(暴力枚举时判断过慢,hash加速判断)2.进制转换,取模思想 3.伪命中点(重要),与hash一同

4.概率分析

你可能感兴趣的:(RABIN_KARP_MATCHER)