Pagini recente » Cod sursa (job #2352355) | Cod sursa (job #2862772) | Cod sursa (job #1609286) | Cod sursa (job #1276702) | Cod sursa (job #975411)
Cod sursa(job #975411)
/*
p-pattern, t-text,
prefix: O(m)
search: O(n)
Total: O(m+n)
Introduction to algorithms 3rd Ed
String matching KMP algorithm
*/
#include<fstream>
using namespace std;
const int MAXN=2000010;
char p[MAXN],t[MAXN];
int next[MAXN],sol[MAXN];
int m,n,nrsol=0;
void read()
{
ifstream fin("strmatch.in");
char c;
fin.get(c);
for (m=1; c!='\n'; ++m)
{
p[m]=c;
fin.get(c);
}
fin.get(c);
for (n=1; c!='\n'; ++n)
{
t[n]=c;
fin.get(c);
}
--n; --m;
fin.close();
}
void prefix()
{
int q=0,k=0; next[1]=0;
for (q=2; q<=m; ++q)
{
while (k && p[k+1]!=p[q])
k=next[k];
if (p[k+1]==p[q])
++k;
next[q]=k;
}
}
void kmp_catcher()
{
int i=0,q=0;
prefix();
for (i=1; i<=n; ++i)
{
while (q && p[q+1]!=t[i])
q=next[q];
if (p[q+1]==t[i])
++q;
if (q==m)
{
sol[nrsol++]=i-m;
q=next[q];
}
}
}
void write()
{
ofstream fout("strmatch.out");
fout<<nrsol<<'\n';
for (int i=0; i<min(1000,nrsol); ++i)
fout<<sol[i]<<' ';
fout<<'\n';
fout.close();
}
int main()
{
read();
kmp_catcher();
write();
return 0;
}