Pagini recente » Cod sursa (job #2936680) | Romanii la DisneyWorld - partea a treia | Istoria paginii onis-2014/solutii-runda-2 | Cod sursa (job #2270769) | Cod sursa (job #1296028)
#include <cstdio>
#include <cstring>
#include <vector>
#define Max_Size 2000009
#define Mod1 10007
#define Mod2 666013
#define q 101
using namespace std;
const char iname[] = "strmatch.in";
const char oname[] = "strmatch.out";
char S[Max_Size], P[Max_Size];
vector < int > Sol;
int main()
{
FILE *in = fopen(iname, "r");
FILE *out = fopen(oname, "w");
fscanf(in, "%s%s", &S, &P );
int N = strlen(S), M = strlen(P), d = 101;
if(N > M) {
fprintf(out, "0\n");
return 0;
}
int HashStr1 = 0, HashStr2 = 0, HashPatt1 = 0, HashPatt2 = 0;
for(int i = 0 ; i < N; ++i) {
HashStr1 = (HashStr1 * q + S[i]) % Mod1;
HashStr2 = (HashStr2 * q + S[i]) % Mod2;
HashPatt1 = (HashPatt1 * q + P[i]) % Mod1;
HashPatt2 = (HashPatt2 * q + P[i]) % Mod2;
}
int q1n = 1, q2n = 1;
for(int i = 1; i < N; ++i) {
q1n = (q1n * q) % Mod1;
q2n = (q2n * q) % Mod2;
}
if(HashStr1 == HashPatt1 && HashStr2 == HashPatt2) Sol.push_back(0);
for(int i = N; i < M; ++i) {
HashPatt1 = ((HashPatt1 - (P[i - N] * q1n) % Mod1 + Mod1) * q + P[i]) % Mod1;
HashPatt2 = ((HashPatt2 - (P[i - N] * q2n) % Mod2 + Mod2) * q + P[i]) % Mod2;
if(HashStr1 == HashPatt1 && HashStr2 == HashPatt2) Sol.push_back(i - N + 1);
}
fprintf(out, "%d\n", Sol.size());
for(int i = 0; i < (Sol.size() <= 1000 ? Sol.size() : 1000); ++i) fprintf(out, "%d ", Sol[i]);
return 0;
}