Cod sursa(job #1839083)

Utilizator flibiaVisanu Cristian flibia Data 2 ianuarie 2017 14:07:38
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("strmatch.in");
ofstream out("strmatch.out");

const int NMAX = 2000006;

string s1, s2; int m, n;
int text[NMAX], pi[NMAX];

void KMP(){
	pi[1] = 0;
	int i = 0;
	for(int j = 2; j <= m; j++){
		while(i > 0 && s1[i+1] != s1[j]){
			i = pi[i];	
		}
		if(s1[i+1] == s1[j]) i++;
		pi[j] = i;
	}
}

int main(){
	in >> s1 >> s2;
	s1 = '|' + s1;
	s2 = '|' + s2;
	m = s1.size()-1;
	n = s2.size()-1;
	KMP();
	int i = 0;
	for(int j = 2; j <= n; j++){
		while(i > 0 && s1[i+1] != s2[j]){
			i = pi[i];
		}
		if(s1[i+1] == s2[j]) i++;
		if(i == m){
			//if(j-m <= 1000) out << j-m << ' ';
			out << j-m << ' ';
			i = pi[i];
		}
	}
	return 0;
}