Pagini recente » Cod sursa (job #2470710) | Cod sursa (job #1608792) | Cod sursa (job #1791128) | Cod sursa (job #2767114) | Cod sursa (job #1877659)
#include <fstream>
#include <vector>
#include <cstring>
#include <cstdlib>
#define LMAX 2000005
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
string a,b;
vector<int> rez;
int F[LMAX];
vector<int> kmp(string a,string b)
{
int N=a.size();
int M=b.size();
memset(F,0,sizeof(F));
///failure function
for(int i=2;i<=M;i++)
{
int j=F[i-1];
while(1)
{
if(b[j]==b[i-1])
{F[i]=j+1;break;}
if(j==0) break;
j=F[j];
}
}
int i,j;i=j=0;
vector<int> ap;
while(1)
{
if(j==N) break;
if(b[i]==a[j])
{
i++;j++;
if(i==M)
{
ap.push_back(j-M);
i=F[i];
}
}
else if(i==0) j++;
else i=F[i];
}
return ap;
}
int main()
{
getline(f,a);
getline(f,b);
rez=kmp(b,a);
int N=min((int)rez.size(),1000);
g<<rez.size()<<"\n";
for(int i=0;i<N;i++)
g<<rez[i]<<" ";
f.close();
g.close();
return 0;
}