Pagini recente » Cod sursa (job #1570647) | Cod sursa (job #1103344) | Cod sursa (job #3208591) | Cod sursa (job #1140664) | Cod sursa (job #2909976)
#include <fstream>
#include <cstring>
#define DIM 2000000
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout("strmatch.out");
char A[DIM+2], B[DIM+2];
int P[DIM+2], sol[1001];
int a, b, i, L, nr;
int main () {
fin>>A+1;
fin>>B+1;
a = strlen(A+1);
b = strlen(B+1);
/// Pentru fiecare i pozitie din A calculam
/// P[i] = lungimea maxima a unui prefix din A care este si sufix care se
/// termina pe pozitia i (in afara cazului trivial al sufixului de lungime i)
L = 0; /// L = lungimea prefixului calculat pentru pozitia anterioara
/// si pe care il actualizam pentru pozitia curenta
for (int i=2;i<=a;i++) {
while (L!=0 && A[i] != A[L+1])
L = P[L];
if (A[i] == A[L+1])
L++;
P[i] = L;
}
/// acum facem o procesare asemanatoare pe sirul in care cautam
/// si la o anume pozitie i cautam lungimea maxima a unui
/// sufix terminat in B la pozitia i si care este prefix in A
/// cand gasim astfel de lungimi egale cu a avem potrivire.
L = 0;
for (i=1;i<=b;i++) {
while (L != 0 && B[i]!=A[L+1])
L = P[L];
if (B[i] == A[L+1])
L++;
if (L == a) {
nr++;
if (nr<=1000)
sol[nr] = i-a;
L = P[L];
}
}
fout<<nr<<"\n";
for (int i=1;i<=min(1000, nr); i++)
fout<<sol[i]<<" ";
return 0;
}