Pagini recente » Cod sursa (job #1064744) | Cod sursa (job #1260679) | Cod sursa (job #763344) | Cod sursa (job #1463334) | Cod sursa (job #1009250)
#include<fstream>
#include<cstring>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
const int Nmax = 2000005;
const int MOD = 110503;
const int a = 62;
char A[Nmax],B[Nmax];
int N,M;
int hashA,hashB,alam=1;
int sol[1005],rasp;
int toi(char c){
if('0'<=c && c<='9') return (int)(c-'0');
if('a'<=c && c<='z') return (int)(c-'a')+10;
if('A'<=c && c<='Z') return (int)(c-'A')+36;
}
void checkEq(int i){
if(hashA==hashB){
rasp++;
if(rasp<=1000) sol[rasp]=i-M+1;
}
}
int main(){
int i;
in.getline(B,Nmax);
in.getline(A,Nmax);
N=strlen(A);
M=strlen(B);
for(i=0;i<M;i++){
hashA=(hashA*a+toi(A[i]))%MOD;
hashB=(hashB*a+toi(B[i]))%MOD;
alam=(alam*a)%MOD;
}
checkEq(i-1);
for(;i<N;i++){
hashA=( (hashA*a)%MOD+(-(alam*toi(A[i-M]))%MOD+MOD)+toi(A[i]) )%MOD;
checkEq(i);
}
out<<rasp<<'\n';
for(i=1;i<=(rasp<1000?rasp:1000);i++) out<<sol[i]<<' ';
return 0;
}