Pagini recente » Cod sursa (job #1185700) | Cod sursa (job #837528) | Rating Horica (danhorea2010) | Cod sursa (job #301095) | Cod sursa (job #1750561)
/*
* 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();
}