Cod sursa(job #975411)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 20 iulie 2013 10:58:04
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
/*
	p-pattern, t-text,
	prefix: O(m)
	search: O(n)
	Total:	O(m+n)

	Introduction to algorithms 3rd Ed
	String matching KMP algorithm
*/
#include<fstream>
using namespace std;
const int MAXN=2000010;
char p[MAXN],t[MAXN];
int next[MAXN],sol[MAXN];
int m,n,nrsol=0;
void read()
{
	ifstream fin("strmatch.in");
	char c;
	fin.get(c);
	for (m=1; c!='\n'; ++m)
	{
		p[m]=c;
		fin.get(c);
	}
	fin.get(c);
	for (n=1; c!='\n'; ++n)
	{
		t[n]=c;
		fin.get(c);
	}
	--n;	--m;
	fin.close();
}
void prefix()
{
	int q=0,k=0;	next[1]=0;
	for (q=2; q<=m; ++q)
	{
		while (k && p[k+1]!=p[q])
			k=next[k];
		if (p[k+1]==p[q])
			++k;
		next[q]=k;
	}
}
void kmp_catcher()
{
	int i=0,q=0;
	prefix();
	for (i=1; i<=n; ++i)
	{
		while (q && p[q+1]!=t[i])
			q=next[q];
		if (p[q+1]==t[i])
			++q;
		if (q==m)
		{
			sol[nrsol++]=i-m;
			q=next[q];
		}
	}
}
void write()
{
	ofstream fout("strmatch.out");
	fout<<nrsol<<'\n';
	for (int i=0; i<min(1000,nrsol); ++i)
		fout<<sol[i]<<' ';
	fout<<'\n';
	fout.close();
}
int main()
{
	read();
	kmp_catcher();
	write();
	return 0;
}