Pagini recente » Cod sursa (job #3189714) | Cod sursa (job #2372487) | Cod sursa (job #2948638) | Cod sursa (job #3214099) | Cod sursa (job #2370737)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
string txt, pat;
int prefix[2000001];
int cate = 0;
void KMP(string txt, string pat)
{
int lenTxt = txt.length();
int lenPat = pat.length();
int i = 0, j = 0;
while(i < lenTxt)
{
if(pat[j] == txt[i])
i++, j++;
if(j == lenPat)
{
cate++;
if(cate <= 1000)
fout << i - j << ' ';
j = prefix[j - 1];
}
else if(i < lenTxt && pat[j] != txt[i])
{
if(j)
j = prefix[j - 1];
else
i++;
}
}
}
void MakePrefix()
{
int len = 0, i = 1, lenPat = pat.length();
while(i < lenPat)
{
if(pat[i] == pat[len])
prefix[i++] = ++len;
else
{
if(len)
len = prefix[len - 1];
else
prefix[i++] = 0;
}
}
}
int main()
{
fout << " \n";
fin >> pat >> txt;
MakePrefix();
KMP(txt, pat);
fout.close();
fout.open("strmatch.out", ios::in | ios::out);
fout << cate;
fin.close();
fout.close();
return 0;
}