Cod sursa(job #1233330)

Utilizator florinpocolPocol Florin florinpocol Data 25 septembrie 2014 09:48:23
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 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;

    i=k;  ok=true;
    while(i<=k+n-1 && ok==true)
    {
        if (a[i-k]!=b[i])
           ok=false;
           else
           i=i+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
{
    long hs,hsub;
    int i;

    ofstream f("auxiliar.txt");

    cont=0;
    hs=0;
    for (i=0; i<=n-1; i++)
        hs=hs+s[i]-64;
    hsub=0;
    for (i=0; i<=n-1; i++)
        hsub=hsub+sub[i]-64;
    //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];
          }

   f.close();
   ifstream ff("auxiliar.txt");
   g<<cont<<"\n";
   for (i=0; i<=cont-1; 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);
}