Cod sursa(job #1092134)

Utilizator RobertSSamoilescu Robert RobertS Data 26 ianuarie 2014 16:57:58
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#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;
}