Pagini recente » Cod sursa (job #1165981) | Cod sursa (job #1998244)
#include<fstream>
#define MAXLEN 2000005
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
char A[MAXLEN], B[MAXLEN];
int prefix[MAXLEN];
void buildPrefixArray(int *prefix, char *A) {
//
int crt = 0;
int l = strlen(A);
prefix[0] = 0;
for (int i = 1; i < l; i++) {
int len = prefix[i - 1];
while (len != 0 && A[len] != A[i]) {
len = prefix[len];
}
if (A[len] == A[i]) prefix[i] = len + 1;
}
}
void printMatches(int prefix[], char A[], char B[]) {
//
int crt = 0;
int lB = strlen(B);
int lA = strlen(A);
int len = 0;
for (int i = 0; i < lB; i++) {
//
while (len != 0 && A[len] != B[i]) {
len = prefix[len];
}
if (A[len] == B[i]) len++;
if (len == lA) {
g << i - lA + 1 << " ";
len = prefix[len - 1];
}
}
}
int main() {
//
f >> A;
f >> B;
buildPrefixArray(prefix, A);
printMatches(prefix, A, B);
return 0;
}