#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <cmath>
using namespace std;
int make_hash(char s,int off,int p,int exp)
{
int hash1;
hash1 = ((int)s-off)*(int)pow(p,exp);
return hash1;
}
int update_hash(int hash1,int s_prev,int s_next,int off,int p,int exp)
{ int u_hash;
u_hash=hash1-((int)s_prev-off)*pow(p,exp);
u_hash=u_hash*p;
u_hash=u_hash+((int)s_next-off);
return u_hash;
}
bool naive(string pattern, string text)
{
int lenP=pattern.size();
bool flag = false;
for (int i = 0; i < lenP; i++)
{
if (pattern[i] != text[i])
{
flag = true;
}
}
return flag;
}
void kr(string pattern,string text,int p,int off,int z)
{
int lenP=pattern.size();
int lenT=text.size();
int hashP=0;
int hashT=0;
int i=0;
while(i<lenP)
{
hashP=hashP+make_hash(pattern[i],off,p,lenP-i-1);
hashT=hashT+make_hash(text[i],off,p,lenP-i-1);
i=i+1;
}
i=lenP;
int j=0;
while(i<=lenT)
{
if(hashP==hashT)
{
naive(pattern,text);
}
if(hashP==hashT)
{
cout<<"Linijka "<<z<<": "<<j<<endl;
}
if(i<lenT)
{
hashT=update_hash(hashT,text[j],text[i],off,p,lenP-1);
}
i=i+1;
j=j+1;
}
}
int main()
{
ifstream file1;
string pattern,text;
int z = 1;
file1.open("tekst.txt");
file1 >> pattern;
while(!file1.eof())
{
getline(file1,text);
//cout<<text<<endl;
kr(pattern,text,3,71,z);
z = z +1;
}
return 0;
}