Cod sursa(job #1233372)

Utilizator florinpocolPocol Florin florinpocol Data 25 septembrie 2014 11:04:24
Problema Potrivirea sirurilor Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

char a[2000001],b[2000001];
int n,m,cont;
ofstream g("strmatch.out");

bool verifica(int k)
{
    bool ok;  int i,j;

    i=k;  j=k+n-1;   ok=true;
  if (a[i-k + n /2]!=b[i + n/2])
                        ok=false;
    while(i<=j && ok==true)
        if (a[i-k]!=b[i] || a[j-k]!=b[j])
           ok=false;
           else
           {
               i=i+1;
               j=j-1;
           }
    return(ok);
}


void RabinKarp(char s[], char sub[]) //se trimit sirurile de lungime n
               //n e lungimea lui sub si m e lungimea lui s
{
    int hs,hsub,i;

    ofstream f("auxiliar.txt");

    cont=0;
    hs=0;
    for (i=0; i<=n-1; i++)
        hs=(hs+s[i]) % 1000000;
    hsub=0;
    for (i=0; i<=n-1; i++)
        hsub=(hsub+sub[i]) % 1000000;
    //cout<<hs<<" "<<hsub;

      for (i=0; i<=m-n; i++)
          {
              if (hs == hsub)
                    if (verifica(i)==true)
                           {
                               f<<i<<" ";
                               cont=cont+1;
                           }

               hs=(hs-s[i]+s[n+i]) % 1000000;
          }

   f.close();
   ifstream ff("auxiliar.txt");
   g<<cont<<"\n";
   if (cont>1000)
       cont=1000;

   for (i=1; i<=cont; i++)
       {
           ff>>hs;
           g<<hs<<" ";
       }

   ff.close();

}


void citire()
{
    ifstream f("strmatch.in");
    f>>a>>b;
    n=strlen(a);
    m=strlen(b);

    f.close();
}

int main()
{

    citire();
    if (n>m)
        g<<"0\n";
        else if (n==m)
             if (verifica(0)==true)
                  g<<"1\n0";
        else;
        else
        RabinKarp(b,a);
    g.close();
    return(0);
}