Pagini recente » Cod sursa (job #700672) | Cod sursa (job #699224) | Cod sursa (job #2176311) | Cod sursa (job #2147982) | Cod sursa (job #2352608)
#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);
}