Pagini recente » Cod sursa (job #32741) | Cod sursa (job #3228058) | Cod sursa (job #1815123) | Cod sursa (job #2976916) | Cod sursa (job #1780070)
#include <bits/stdc++.h>
#define prime 73
#define NMax 2000005
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
char x[NMax],y[NMax];
int pw[NMax];
int Hx,Hy,Sx,Sy;
vector<int> ans;
int ch(char x){
if(x >='a')
return (x - 'a' + 1);
else
return (x - 'A' + 1);
}
int main()
{
f.getline(x,NMax);
f.getline(y,NMax);
Sx = strlen(x);
Sy = strlen(y);
pw[0] = 1;
for(int i = 1; i <= Sx; ++i)
pw[i] = pw[i - 1] * prime;///precalculez pow(prim,i);
for(int i = 0; i < Sx; ++i)
Hx += ch(x[i]) * pw[i];///calculez hashul substringului
for(int i = 0; i < Sx; ++i)///calculez hashul primelor Sx litere din text
Hy += ch(y[i]) * pw[i];
for(int i = 1; i <= Sy - Sx + 1; ++i){
///verific Hy
g << Hy << ' ';
if(Hy == Hx){ ///verific coliziunea in hash
bool ok = true;
for(int j = 0; ok && j < Sx; ++j)
if(x[j] != y[j + i - 1])
ok = false;
if(ok == true)
ans.push_back(i);
}
if(i == Sy)
break;
Hy -= 1;
Hy /= prime;
Hy += (ch(y[i + Sx - 1]) * pw[Sx - 1]);
}
g << ans.size() << '\n';
for(int i = 0; i < ans.size(); ++i){
g << ans[i] - 1 << ' ';
}
return 0;
}