Cod sursa(job #2739233)

Utilizator vali_27Bojici Valentin vali_27 Data 7 aprilie 2021 12:06:33
Problema Potrivirea sirurilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cmath>

std::ifstream f("strmatch.in");
std::ofstream g("strmatch.out");

typedef unsigned long long ULL;

const int prime = 13;

unsigned hash(const std::string& s, int start, int end)
{
	unsigned h = 0, p = 1;
	for (int i = end; i>=start;--i)
	{
		h += s[i] * p;
		p *= prime;
	}
	return h;
}
 

void find(const std::string& s, const std::string& pattern)
{
	int patSize = pattern.size();
	int sSize = s.size();
	int count = 0;
	int apar[1000] = { 0 };
	unsigned pathash = hash(pattern, 0, patSize - 1);
	unsigned shash = hash(s, 0, patSize  - 1);
	
	unsigned p = 1;
	for (int i = 1; i < patSize; i++)
		p = (p * prime);
 
	for (int i = 0; i <= sSize - patSize; ++i)
	{
		 
		if (pathash == shash)
		{
			 
			bool ok = true;
			for (int k = 0; ok && k < patSize; ++k)
				if (s[i + k] != pattern[k])ok = false;

			if (ok)
			{
				if (count < 1000)
					apar[count] = i;
				count++;
			}
		}
		if (i + patSize < sSize)
			shash = (shash - p * s[i]) * prime + s[i + patSize] ;
		
	}
	g << count << '\n';
	int aparSize = std::min(1000, count);
	for (int i = 0; i < aparSize; ++i)
		g << apar[i] << ' ';
}

int main()
{
	std::string s, p;
	
	f >> p >> s;
	
	find(s, p);
}