Pagini recente » Cod sursa (job #363189) | Cod sursa (job #2949971) | Cod sursa (job #2719681) | Cod sursa (job #2267790) | Cod sursa (job #631502)
Cod sursa(job #631502)
#include<fstream>
#include<cstring>
#define NMAX 2000010
#define B 83
#define P1 104729
#define P2 666013
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
char c1[NMAX], c2[NMAX];
int n1, n2, hash1, hash2, h1, h2, nr=0, a[NMAX], x1=1, x2=1, i;
inline int litera(char c)
{
if (c>='A' && c<='Z') return c-'A';
else if (c>='a' && c<='z') return c-'a'+'Z'-'A'+1;
return c-'0'+'Z'-'A'+'z'-'a'+1;
}
int main()
{
f.getline(c1, NMAX);
f.getline(c2, NMAX);
n1=strlen(c1); n2=strlen(c2);
for (i=0; i<n1; ++i)
{
hash1=(((hash1*B)%P1)+litera(c1[i]))%P1;
h1=(((h1*B)%P2)+litera(c1[i]))%P2;
hash2=(((hash2*B)%P1)+litera(c2[i]))%P1;
h2=(((h2*B)%P2)+litera(c2[i]))%P2;
}
for (i=1; i<n1; ++i)
{
x1=(x1*B)%P1;
x2=(x2*B)%P2;
}
if (h1==h2 && hash1==hash2) a[++nr]=0;
for (i=n1; i<n2; ++i)
{
hash2=hash2-((litera(c2[i-n1])*x1)%P1);
if (hash2<0) hash2+=P1;
hash2=(hash2*B+litera(c2[i]))%P1;
h2=h2-((litera(c2[i-n1])*x2)%P2);
if (h2<0) h2+=P2;
h2=(h2*B+litera(c2[i]))%P2;
if (hash2==hash1 && h2==h1) a[++nr]=i-n1+1;
}
g<<nr<<"\n";
int mm=min(nr, 1000);
for (i=1; i<=mm; ++i) g<<a[i]<<" ";
f.close();
g.close();
return 0;
}