Pagini recente » Cod sursa (job #2053054) | Cod sursa (job #607428) | Cod sursa (job #1731306) | Cod sursa (job #1334897) | Cod sursa (job #1129302)
#ifdef __INFOARENA_PROJ
#include "infoarena.h"
#endif
#include <fstream>
#include <algorithm>
#ifdef __INFOARENA_PROJ
namespace strmatch {
#endif
unsigned const int maxL = 2000000, maxNPrint = 1000;
unsigned T[maxL + 1];
char A[maxL + 3], B[maxL + 3];
void buildPrefixTable(const char* W, unsigned* T)
{
T[0] = -1; T[1] = 0;
unsigned q = 0, pos = 2;
while (W[pos] != '\0')
{
if (W[pos - 1] == W[q])
T[pos++] = ++q;
else if (q == 0)
T[pos++] = 0;
else while (q > 0)
q = T[q];
}
}
int main()
{
std::ifstream in("strmatch.in");
std::ofstream out("strmatch.out");
unsigned lenA, lenB;
in.getline(A, maxL + 1);
lenA = (unsigned) in.gcount() - 1;
in.getline(B, maxL + 1);
lenB = (unsigned) in.gcount() - 1;
if (B[lenB] != '\0')
++lenB;
buildPrefixTable(A, T);
unsigned offset;
if (lenA > 1)
offset = lenA - T[lenA - 1] - 1;
else offset = 1;
unsigned m = 0, i = 0;
unsigned N = 0, pos[maxNPrint + 1];
while (m + i < lenB)
{
if (A[i] == B[m + i])
{
if (i == lenA - 1)
{
if (++N <= 1000)
pos[N] = m;
m = m + offset, i = i - offset;
}
else ++i;
}
else if (i == 0)
++m;
else /*i > 0*/
m = m + i - T[i], i = T[i];
}
out << N << '\n';
for (unsigned i = 1; i <= N && i <= 1000; ++i)
out << pos[i] << ' ';
out << '\n';
return 0;
}
#ifdef __INFOARENA_PROJ
}
#endif