Pagini recente » Cod sursa (job #1631722) | Cod sursa (job #1841850) | Cod sursa (job #789195) | Cod sursa (job #2557801) | Cod sursa (job #1376408)
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
#define MAXL 2000000
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
char A[MAXL+1], B[MAXL+1];
int PI[MAXL+1];
int n, m;
vector<int> pos;
void constr_prefix(){
// table:
/*
* char: |a|b|a
* index:|0|1|2
* value:|0|0|1
* for "abab" -> prefixes = {"aba", "ab", a"}
* -> suffixes = {"bab", "ab", b"}
*/
PI[1] = 0;
int k = 0;
for(int i = 1; i < n; i++) {
while((k>0) && (A[k] != A[i])) k = PI[k];
if(A[k] == A[i]) k++;
PI[i] = k;
}
}
int KMP(){
int matched = 0;
int k = 0;
for(int i = 0; i < m; i++) {
while((k > 0) && (A[k] != B[i])) k = PI[k-1];
if(A[k] == B[i]) k++;
if(k==n) {
matched++;
if(matched<=1000) pos.push_back(i-n+1);
}
}
return matched;
}
int main()
{
std::ios::sync_with_stdio(false);
fin >> A >> B;
n = strlen(A);
m = strlen(B);
constr_prefix();
fout<< KMP()<<endl;
int N = (pos.size() > 1000)?1000:pos.size();
for(int i = 0; i < N; i++)
fout<<pos[i]<< ' ';
fout<<endl;
}