Pagini recente » Cod sursa (job #1286594) | Cod sursa (job #2222718) | Cod sursa (job #1141043) | Cod sursa (job #1514176) | Cod sursa (job #2457961)
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#define NMAX 2000000
#define MOD1 666013
#define MOD2 666019
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
long long l1, l2;
long long put27_1=1, put27_2=1, nr1_1, nr1_2, nr2_1, nr2_2;
char s1[NMAX+10], s2[NMAX+10];
vector <int> sol;
int main()
{
f >> s1 >> s2;
l1 = strlen(s1), l2 = strlen(s2);
for(int i=1; i<l1; i++)
{ put27_1 = ((long long)put27_1 * 27) % MOD1;
put27_2 = ((long long)put27_2 * 27) % MOD2;
}
for(int i=0; i<l1; i++)
{ nr1_1 = ((long long)nr1_1 * 27 + (s1[i] - 'A' + 1)) % MOD1;
nr1_2 = ((long long)nr1_2 * 27 + (s1[i] - 'A' + 1)) % MOD2;
}
for(int i=0; i<l1; i++)
{ nr2_1 = ((long long)nr2_1 * 27 + (s2[i] - 'A' + 1)) % MOD1;
nr2_2 = ((long long)nr2_2 * 27 + (s2[i] - 'A' + 1)) % MOD2;
}
if(nr1_1 == nr2_1 && nr1_2 == nr2_2)
sol.push_back(0);
for(int i=l1; i<l2; i++)
{ nr2_1 = ((((long long)nr2_1 - put27_1 * (s2[i-l1] - 'A' + 1)) % MOD1 + MOD1) * 27 + s2[i] - 'A' + 1) % MOD1;
nr2_2 = ((((long long)nr2_2 - put27_2 * (s2[i-l1] - 'A' + 1)) % MOD2 + MOD2) * 27 + s2[i] - 'A' + 1) % MOD2;
if(nr1_1 == nr2_1 && nr1_2 == nr2_2) sol.push_back(i-l1+1);
}
g << sol.size() << '\n';
int len = sol.size();
for(int i=0; i<min(1000, len); i++) g << sol[i] << ' ';
g << '\n';
return 0;
}