Pagini recente » Cod sursa (job #1209493) | Cod sursa (job #775198) | Cod sursa (job #1730434) | Cod sursa (job #2507507) | Cod sursa (job #2791607)
#include <iostream>
#include <fstream>
#include <cstring>
#define nr_prim 27143
#define baza 37
using namespace std;
ifstream f("strmatch.in");
ofstream g ("strmatch.out");
int cnt;
int rasp[2000001];
char patt[2000001],text[2000001];
void cautare()
{
long long baza_la_puterea_m = 1;
int m = strlen(patt),n = strlen(text);
for(int i = 0;i<m-1;i++)
{
baza_la_puterea_m = (baza_la_puterea_m *baza)%nr_prim;
}
long long patt_hash = 0,text_hash= 0;
for(int i = 0;i<m;i++)
{
patt_hash = (patt_hash*baza + patt[i])%nr_prim;
text_hash = (text_hash*baza + text[i])%nr_prim;
}
for(int i =0;i<=n-m;i++)
{
if(patt_hash == text_hash)
{
bool adev = true;
for(int j = 0;j<m;j++)
if(patt[j]!= text[j+i])
{
adev = false;
break;
}
if(adev)
rasp[cnt++] = i;
}
if(i<n-m)
{
text_hash = (((text_hash-(1ll*text[i]*baza_la_puterea_m)%nr_prim + nr_prim)*baza)%nr_prim+text[i+m])%nr_prim;
}
}
}
int main()
{
f >> patt>>text
cautare();
g << cnt<< endl;
for(int i = 0;i<min(1000,cnt);i++)
g <<rasp[i]<< " ";