Cod sursa(job #650353)

Utilizator ELHoriaHoria Cretescu ELHoria Data 17 decembrie 2011 21:48:29
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <fstream>
#include <string>

using namespace std;

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

void kmp(const string &s,const string &t)
{
	int n = t.size() , m = s.size() , v[1005];
	int *a = new int[m] , k , i  , match = 0;
	a[0] = 0;
	for(i = 1 , k = 0;i < m;++i)
	{
		while(k > 0 && s[i] != s[k]) k = a[k-1];

		if(s[i] == s[k]) k++;

		a[i] = k;
	}
	for(i = k = 0;i < n;++i)
	{
		while(k > 0 && t[i] != s[k]) k = a[k-1];

		if(t[i] == s[k]) k++;
		
		if(k == m) 
			{	
				if(match < 1000) v[match++] =  i - m + 1;
				match++;
				k = a[k-1];
			}
	}
	fout<<match<<'\n';
	match = min(match,1000);
	for(int i = 0;i<match;++i)
		fout<<v[i]<<" ";
}

int main()
{
	string a ,b;
	fin>>a>>b;
	kmp(a,b); 
	return 0;
}