Pagini recente » Cod sursa (job #1554325) | Cod sursa (job #1026718) | Cod sursa (job #2286549) | Clasament utcn_blitz | Cod sursa (job #2674154)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
#define MAXLENGTH 2000001
#define MAXRESULT 1001
char T[MAXLENGTH], P[MAXLENGTH];
int N, LPS[MAXLENGTH], result[MAXRESULT];
int lenT, lenP;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
void calculateLongestPrefixSubfix() {
int i=1;
int j=0;
LPS[0] = 0;
while (i < lenP) {
if (P[i] == P[j]) {
LPS[i] = LPS[i-1] + 1;
i++;
j++;
}
else if (j != 0) {
j=LPS[j-1];
}
else {
i++;
}
}
}
void KMP() {
int i=0;
int j=0;
while (i<lenT) {
if(T[i] == P[j]) {
i++;
j++;
} else if (j != 0) {
j=LPS[j-1];
} else {
i++;
}
if (j == lenP) {
result[N] = i-j;
N++;
j = LPS[j-1];
if (N == 1000)
break;
}
}
}
void afisare() {
fout<<N<<endl;
for (int i=0; i<N; i++) {
fout<<result[i]<<" ";
}
}
int main()
{
fin.getline(P, MAXLENGTH);
fin.getline(T, MAXLENGTH);
lenT = strlen(T);
lenP = strlen(P);
calculateLongestPrefixSubfix();
KMP();
afisare();
for(int i=0; i<lenP; i++)
cout<<LPS[i]<<" ";
return 0;
}