Cod sursa(job #1483709)

Utilizator tain1234andrei laur tain1234 Data 9 septembrie 2015 19:48:01
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <vector>
#include <string>
#include <fstream>
using namespace std;
vector<int> f;
string target, pattern;
void pre()
{
	int m = pattern.length(), k;
	f[0] = -1;
	for (int i = 1; i <=m; i++)
	{
		k = f[i - 1];
		while (k >= 0)
		{
			if (pattern[k] == pattern[i - 1])
				break;
			else
				k = f[k];
		}
		f[i] = k + 1;
	}
}
void KMP(ofstream& g)
{
	int m = pattern.length();
	int n = target.length();
	f.resize(m+1);
	pre();
	int i = 0;
	int k = 0;
	while (i < n)
	{
		if (k == -1)
		{
			++i;
			k = 0;
		}
		else if (target[i] == pattern[k])
		{
			++i;
			++k;
			if (k == m){
				g << i - m <<"\n";
				k = f[k];
			}
		}
		else
			k = f[k];
	}

}
int main()
{
	ifstream f("strmatch.in");
	ofstream of("strmatch.out");
	f >> pattern;
	f >> target;
	KMP(of);
	system("pause");
	return 0;
}