Cod sursa(job #1478733)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 29 august 2015 14:04:19
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
#include <string>

using namespace std;

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

string a,b;
int n;
int zFunction[4000000];

int leftLimit, rightLimit;

int main(void){
	
	in >> a;
	in >> b;
	a += "*"+b;
	n =a.length();
	leftLimit = 0;rightLimit = 0;
	for (int i=1;i<n;i++){
		if (i>rightLimit && a[i]==a[0]){
			leftLimit = i;
			for (rightLimit = leftLimit; rightLimit+1<n, a[rightLimit+1]==a[rightLimit-leftLimit+1];rightLimit++);
			zFunction[i]=rightLimit-leftLimit+1;
		}else if(i<=rightLimit){
			zFunction[i] = zFunction[rightLimit-i];
			if (rightLimit-i<a[i]){
				leftLimit = i;
				rightLimit = i+zFunction[i]-1;
				for (;rightLimit+1<n, a[rightLimit+1]==a[rightLimit-leftLimit+1];rightLimit++);
				zFunction[i]=rightLimit-leftLimit+1;
			}
		}
	}
	
	for (int i=0;i<n;i++) out << " " << zFunction[i];
	
	return 0;
}