Cod sursa(job #800882)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 22 octombrie 2012 20:43:44
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

const int MAXL=2001000;

char needle[MAXL],haystack[MAXL];
int needleLength,haystackLength;
int state;
int prefix[MAXL];

vector <int> results;
int resultsNr;

void read(){
	string aux;
	in>>aux;
	for(int i=0;i<aux.length();++i){
		needle[i+1]=aux[i];
	}
	needleLength=aux.length();
	in>>aux;
	for(int i=0;i<aux.length();++i){
		haystack[i+1]=aux[i];
	}
	haystackLength=aux.length();
}
void buildPrefix(){
	int prefixState=0;
	for(int i=2;i<=needleLength;++i){ // incepem de la 2 pentru ca avem nevoie de primul sufix propriu care e prefix
		while(prefixState && needle[i]!=needle[prefixState+1]){
			prefixState=prefix[prefixState];
		}
		if(needle[prefixState+1]==needle[i]) // daca se face potrivirea dupa sufixul/prefixul anterior se mareste sufixul/prefixul curent
			prefixState++;
		prefix[i]=prefixState;
	}
}

void search(){
	int currentState=0;
	for(int i=1;i<=haystackLength;++i){
		while(needle[currentState+1]!=haystack[i] && currentState){
			currentState=prefix[currentState];
		}
		if(needle[currentState+1]==haystack[i]){
			currentState++;
		}
		if(currentState==needleLength){
			resultsNr++;
			currentState=prefix[currentState];
			if(resultsNr<=1000){
				results.push_back(i-needleLength);
			}
		}
	}
}

void print(){
	out<<resultsNr<<"\n";
	for(int i=0;i<results.size();++i){
		out<<results[i]<<" ";
	}
}

int main(){
	read();
	buildPrefix();
	search();
	print();
	return 0;
}