Pagini recente » Cod sursa (job #1805176) | Cod sursa (job #1567392) | Monitorul de evaluare | Cod sursa (job #2004122) | Cod sursa (job #1233372)
#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);
}