Cod sursa(job #1726546)

Utilizator krityxAdrian Buzea krityx Data 8 iulie 2016 12:38:14
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <string>
#include <vector>
#include<algorithm>
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";
	int mm = min(1000, (int)matches.size());
	for (int i = 0; i < mm;i++)
	{
		g << matches[i] << " ";
	}

	return 0;
}