Pagini recente » Cod sursa (job #2835168) | Cod sursa (job #2729261) | Cod sursa (job #2455340) | Cod sursa (job #2545828) | Cod sursa (job #1172351)
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
#define nmax 2000005
int k, i, j, n, m;
int pi[nmax],sol[nmax];
// Pi[i] = lungimea celui mai lung prefix din P care este si sufix in P
char P[nmax], T[nmax];
void pp(){
pi[1] = 0;
k = 0;
for (i=2; i<=m; i++){ // cautam cel mai lung prefix din P care este si sufix in sirul P[1..k]
while (k>0 && P[k+1] != P[i])
k = P[k];
if (P[k+1] == P[i]) k++;
pi[i] = k;
}
}
void kmp(){
for (i=1, k=0; i<=n; i++){
while (k>0 && P[k+1] != T[i]) k = pi[k];
if (P[k+1] == T[i]) k++;
if (k == m){
sol[++sol[0]] = i-m;
k = pi[k];
}
}
}
void tiparire(){
ofstream out("strmatch.out");
out << min(1000, k) << "\n";
for (i=1; i<=min(1000, k); i++)
out << sol[i] << " ";
out << "\n";
}
int main(){
ifstream in("strmatch.in");
in >> (P+1);
in >> (T+1);
m = strlen(P+1);
n = strlen(T+1);
pp();
kmp();
tiparire();
return 0;
}