Pagini recente » Cod sursa (job #2040583) | Cod sursa (job #1522595) | Cod sursa (job #1696703) | Cod sursa (job #1448554) | Cod sursa (job #1092134)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
#define MAX_N 2000000
char s1[MAX_N], s2[MAX_N];
int t[MAX_N];
void overlap(char w[MAX_N]){
t[0] = -1;
t[1] = 0;
int pos = 2;
int cnd = 0;
while( (unsigned)pos < strlen(w)){
if(w[pos-1] == w[cnd]){
cnd ++;
t[pos] = cnd;
pos ++;
}else if(cnd > 0){
cnd = t[cnd];
}else{
t[pos] = 0;
pos++;
}
}
}
void kmp(char s[MAX_N], char w[MAX_N]){
int m = 0, i = 0;
while(m+i < strlen(s)){
if(w[i] == s[m+i]){
if(i == strlen(w)-1){
cout << m << " ";
m = m+i-t[i];
if(t[i] > -1) i = t[i];
else i = 0;
}
i++;
}else{
m = m+i-t[i];
if(t[i] > -1) i = t[i];
else i = 0;
}
}
}
void read(){
fin.get(s1,MAX_N);
fin.get();
fin.get(s2,MAX_N);
overlap(s1);
kmp(s2,s1);
}
int main(){
read();
return 0;
}