Pagini recente » Cod sursa (job #2753658) | Cod sursa (job #1202021) | Cod sursa (job #3202334) | Cod sursa (job #2237434) | Cod sursa (job #2334673)
#include <iostream>
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout("strmatch.out");
const int N_MAX = 2000000 + 5;
char P[N_MAX], T[N_MAX];
int key[N_MAX];
vector<int> ans;
void makeKey(){
int k = 0, m = strlen(P+1);
for(int i = 2; i<=m; ++i){
while(k && P[i] != P[k+1])
k = key[k];
if(P[i] == P[k+1])
k++;
key[i] = k;
}
}
void kmp(){
int k = 0, n = strlen(T+1), m = strlen(P+1);
for(int i = 1; i <=n; ++i){
while(k && T[i] != P[k+1])
k = key[k];
if(T[i] == P[k+1])
k++;
if(k == m){
ans.push_back(i-m);
k = key[k];
}
}
}
int main(){
fin >> (P+1);
fin >> (T+1);
makeKey();
kmp();
for(int i = 0; i < ans.size(); ++i, fout << " ")
fout << ans[i];
return 0;
}
// român convertit la moldovenism