Cod sursa(job #2352608)

Utilizator AfloareiAfloarei Andrei Afloarei Data 23 februarie 2019 14:28:17
Problema Potrivirea sirurilor Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main()
{
	ifstream infile;
	ofstream outfile;

	infile.open("strmatch.in");
	outfile.open("strmatch.out");

	string a, b;
	// string b = "CABBABABACCABA";		REMOVE AFTER
	int count_a = 0, count_b = 0;	//numarul de litere din 'a', 'b'
	int num = 0, raspuns = 0;	//val folosite in cautarea asemanarilor
	char litera = ' ';	//val folosita la sortare

	vector<char> av, bv;	//contine sirurile 'a', 'b'; (litera cu litera)
	vector<int> loc;	//contine pozitiile repetarilor

	infile >> a >> b;

	for(char c: a)	//introduc sirul din fisier in a (litera cu litera)
	{
		av.push_back(c);
		count_a++;
	}

	for(char c: b)	//introduc sirul din fisier in b (litera cu litera)
	{
		bv.push_back(c);
		count_b++;
	}


	if((count_a > 1) && (count_a <= 2000000) &&
		(count_b > 1) && (count_b <= 2000000))
	{
		for(int i=0; i<count_b; i++)	//caut asemanari intre sirul 'a' si 'b'
		{
			if((bv[i] == litera) && (bv[i+1] == litera))
			{
				litera = ' ';
			}
			else if(bv[i] == av[num])
			{
				litera = bv[i];
				if(num+1 == count_a)
				{
					raspuns++;
					loc.push_back(i+1-count_a);
					num = 0;
					i--;
				}
				else
				{
					num++;
				}

				if(raspuns >= 10000)
				{
					goto final;
				}
			}

			else if(bv[i] != av[num])
			{
				num = 0;
			}
		}
	}

	else if(count_a == 1)
	{
		for(int i=0; i<count_b; i++)	//cauta asemanari intre sirul 'a' si 'b'
		{
			if(bv[i] == av[0])
			{
				raspuns++;
				loc.push_back(i+1-count_a);
			}
			if(raspuns >= 1000)
			{
				goto final;
			}
		}
	}

	final:
	outfile << raspuns << endl;	//returnez numarul aparitiilor
	for(int i: loc)	//returnez pozitia fiecarei repetari
	{
		outfile << i << " ";
	}

	infile.close();
	outfile.close();

	return(0);
}