Cod sursa(job #1750561)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 30 august 2016 14:55:41
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
/*
 * Source.cpp
 *
 *  Created on: 30 Aug 2016
 *      Author: dtoniuc
 */

#include <fstream>
#include <cstring>
#include <queue>

#define MAX_LEN 2000001

using namespace std;

void ReadInput(char* A, char* B);
void CreatePrefixArray(char* A, int m, int* prefix);
void GetNumberOfApparences(char* A, char* B, int m, int n, int*, queue<int>*);
void PrintResult(queue<int>* result);

int main()
{
	char A[MAX_LEN];
	char B[MAX_LEN];

	ReadInput(A, B);

	int n = strlen(B);
	int m = strlen(A);
	int* prefix = new int[m + 1]();

	CreatePrefixArray(A, m, prefix);

	queue<int> *result = new queue<int>();

	GetNumberOfApparences(A, B, m, n, prefix, result);

	PrintResult(result);
}

void ReadInput(char* A, char* B)
{
	ifstream fin;
	fin.open("strmatch.in");

	fin >> A;
	fin >> B;

	fin.close();
}

void CreatePrefixArray(char* A, int m, int* prefix)
{
	int k = 0;
	prefix[1] = 0;
	for(int i = 2; i <= m; i++)
	{
		while(k > 0 && A[k] != A[i-1])
		{
			k = prefix[k];
		}
		if(A[k] == A[i-1])
		{
			k++;
		}
		prefix[i] = k;
	}
}

void GetNumberOfApparences(char* A, char* B, int m, int n, int* prefix, queue<int>* result)
{
	int q = 0;
	for(int i = 1; i <= n; i++)
	{
		while (q > 0 && A[q] != B[i-1])
		{
			q = prefix[q];
		}
		if (A[q] == B[i-1])
		{
			q = q + 1;
		}
		if (q == m)
		{
			result->push(i - q);
		}
	}
}

void PrintResult(queue<int>* result)
{
	ofstream fout;
	fout.open("strmatch.out");

	fout << result->size() << "\n";

	for(int i = 1; i <= 1000; i++)
	{
		if(result->empty())
		{
			break;
		}

		fout << result->front() << " ";
		result->pop();
	}

	fout.close();
}