Cod sursa(job #2350358)

Utilizator roberthostiucHostiuc Robert Gabriel roberthostiuc Data 21 februarie 2019 11:43:23
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define nmax 2000005

using namespace std;

ifstream fin("strmatch.in");
ofstream fout("strmatch.out");

int M,N;
char A[nmax],B[nmax];
int pos[1025],pi[nmax];

void make_prefix(void)
{
	int i, q = 0;

	for (i = 2, pi[1] = 0; i <= M; ++i)
	{
		while (q && A[q+1] != A[i])
			q = pi[q];
		if (A[q+1] == A[i])
			++q;
		pi[i] = q;
	}
}

int main()
{
    int i, q = 0, n = 0;
    fin>>A;
    fin>>B;
    for (; (A[M] >= 'A' && A[M] <= 'Z') || (A[M] >= 'a' && A[M] <= 'z')
			|| (A[M] >= '0' && A[M] <= '9'); ++M);
	for (; (B[N] >= 'A' && B[N] <= 'Z') || (B[N] >= 'a' && B[N] <= 'z')
			|| (B[N] >= '0' && B[N] <= '9'); ++N);
	for (i = M; i; --i) A[i] = A[i-1]; A[0] = ' ';
	for (i = N; i; --i) B[i] = B[i-1]; B[0] = ' ';
    make_prefix();
    for (i = 1; i <= N; ++i)
	{
		while (q && A[q+1] != B[i])
			q = pi[q];
		if (A[q+1] == B[i])
			++q;
		if (q == M)
		{
			q = pi[M];
			++n;
			if (n <= 1000)
				pos[n] = i-M;
		}
	}
	fout<<n<<"\n";
	for(int i=1;i<=n;i++)
        fout<<pos[i]<<" ";
    return 0;
}