Cod sursa(job #810698)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 10 noiembrie 2012 20:30:44
Problema Potrivirea sirurilor Scor 16
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <cstring>
#define NMAX 20004

using namespace std;

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

const unsigned int CodeKey = 32749;

unsigned long long  KeyExt, KeyXor, KeyAsc;
unsigned long long SKeyExt,SKeyXor,SKeyAsc;

int Rez[1004],Nr;

inline unsigned int Code(int nr){ return nr * CodeKey;}

void Contor(int p)
{
    if(Nr>1000)return;
    Nr++;
    Rez[Nr] = p;
}

bool Verifica()
{
    if(KeyXor==SKeyXor && KeyAsc == SKeyAsc && KeyExt == SKeyExt)
        return 1;
    return 0;
}

int main()
{
    char A[NMAX],S[NMAX];
    int N,M,i;
    in>>A;    N = strlen(A);
    in>>S;    M = strlen(S);
    KeyXor = 0;KeyAsc = 0;KeyExt = 0;SKeyXor = 0;SKeyAsc = 0;SKeyExt = 0;
    for(i=0;i<N;i++)
        KeyXor^=Code(A[i]);
    SKeyXor = 0;
    for(i=0;i<N;i++)
        SKeyXor ^=Code(S[i]);

    if(Verifica())
        Contor(0);

    for(i=N;i<M;i++)
    {
        SKeyXor^= Code(S[i-N]),SKeyXor^= Code(S[i]);

        if(Verifica())
            Contor(i-N+1);
    }
    out<<Nr<<'\n';
    for(i=1;i<=Nr&&i<=1000;i++)
        out<<Rez[i]<<' ';
    return 0;
}