Cod sursa(job #1726538)

Utilizator krityxAdrian Buzea krityx Data 8 iulie 2016 12:24:35
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <string>
#include <vector>

using namespace std;

vector<int> buildKMP(string pattern)
{
	vector<int> kmp;
	kmp.resize(pattern.length());
	int i = 0, j = 1;
	kmp[0] = 0;
	while (j < pattern.length())
	{
		if (pattern[i] == pattern[j])
			kmp[j++] = ++i;
		else
		{
			if (i > 0)
			{
				i = kmp[i - 1];
			}
			else
			{
				kmp[j++] = 0;
			}
		}
	}
	return kmp;
}

int main()
{
	ifstream f("strmatch.in");
	ofstream g("strmatch.out");
	string pattern, text;

	f >> pattern >> text;
	vector<int> matches;

	auto kmp = buildKMP(pattern);

	int i = 0; //pattern
	int j = 0; //text

	while (j < text.length())
	{
		if (pattern[i] == text[j])
		{
			i++; j++;
		}
		if (i == pattern.length()) //matched whole pattern
		{
			matches.push_back(j - i);
			i = kmp[i - 1];
		}
		else if (pattern[i] != text[j])
		{
			if (i > 0)
			{
				i = kmp[i - 1];
			}
			else
			{
				j++;
			}
		}
		
	}
	
	g << matches.size() << "\n";
	for (vector<int>::iterator it = matches.begin(); it != matches.end(); it++)
	{
		g << *it << " ";
	}

	return 0;
}