Cod sursa(job #2739235)

Utilizator vali_27Bojici Valentin vali_27 Data 7 aprilie 2021 12:12:47
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 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 prime1 = 13;
const int prime2 = 29;

unsigned hash(const std::string& s, int start, int end, int prime)
{
	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 pathash1 = hash(pattern, 0, patSize - 1,prime1);
	unsigned pathash2 = hash(pattern, 0, patSize - 1,prime2);
	unsigned shash1 = hash(s, 0, patSize  - 1,prime1);
	unsigned shash2 = hash(s, 0, patSize  - 1,prime2);
	
	unsigned p1 = 1,p2 = 1;
	for (int i = 1; i < patSize; i++)
	{
		p1 *= prime1;
		p2 *= prime2;
	}
 
	for (int i = 0; i <= sSize - patSize; ++i)
	{ 
		if (pathash1 == shash1 && pathash2 == shash2)
		{
				if (count < 1000)
					apar[count] = i;
				count++;	
		}
		if (i + patSize < sSize)
		{
			shash1 = (shash1 - p1 * s[i]) * prime1 + s[i + patSize];
			shash2 = (shash2 - p2 * s[i]) * prime2 + 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);
}