Pagini recente » Arhiva Educationala | Cod sursa (job #2650492) | Cod sursa (job #3284209) | Cod sursa (job #399706) | Cod sursa (job #3236034)
#include <fstream>
#include <cstring>
#define MAXN 2000001
#define P 77
#define MOD1 100007
#define MOD2 100021
using namespace std;
ifstream in ("strmatch.in"); ofstream out ("strmatch.out");
char A[MAXN], B[MAXN];
int lgA, lgB;
int nrAmod1, nrAmod2, P1, P2, nrBmod1, nrBmod2;
char match[MAXN];
int main(){
in >> A >> B;
lgA = strlen(A);
lgB = strlen(B);
P1 = P2 = 1;
for (int i = 0; i < lgA; i++){
nrAmod1 = (nrAmod1 * P + A[i]) % MOD1;
nrAmod2 = (nrAmod2 * P + A[i]) % MOD2;
if (i != 0)
P1 = (P1 * P) % MOD1,
P2 = (P2 * P) % MOD2;
}
if (lgA > lgB){
out << 0;
return 0;
}
for (int i = 0; i < lgA; i++)
nrBmod1 = (nrBmod1 * P + B[i]) % MOD1,
nrBmod2 = (nrBmod2 * P + B[i]) % MOD2;
int Nr = 0;
if (nrBmod1 == nrAmod1 && nrBmod2 == nrAmod2)
match[0] = 1, Nr++;
for (int i = lgA; i < lgB; i++){
nrBmod1 = ((nrBmod1 - (B[i - lgA] * P1) % MOD1 + MOD1) * P + B[i]) % MOD1;
nrBmod2 = ((nrBmod2 - (B[i - lgA] * P2) % MOD2 + MOD2) * P + B[i]) % MOD2;
if (nrBmod1 == nrAmod1 && nrBmod2 == nrAmod2)
match[ i - lgA + 1 ] = 1, Nr++;
}
out << Nr;
Nr = 0;
for (int i = 0; i < lgB && Nr < 1000; i++)
if (match[i])
Nr++,
out << i;
out << endl;
return 0;
}