Pagini recente » Cod sursa (job #938392) | Cod sursa (job #938178) | Cod sursa (job #26671) | Cod sursa (job #18435) | Cod sursa (job #903859)
Cod sursa(job #903859)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
char a[2000001];
char b[2000001];
int pi[2000000];
vector <int> in;
void Prefix(char b[])
{
int m=strlen(b);
int k=-1;
pi[0]=-1;
for(int q=1;q<m;q++)
{
while(k>-1 && b[k+1]!=b[q])
k=pi[k];
if(b[k+1]==b[q])
k++;
pi[q]=k;
}
}
void KMP(char a[],char b[])
{
int n=strlen(a);
int m=strlen(b);
int q=-1;
Prefix(b);
for(int i=0;i<n;i++)
{
while(q>-1 && b[q+1]!=a[i])
q=pi[q];
if(b[q+1]==a[i])
q++;
if(q==m-1)
{
q=pi[n];
in.push_back(i-m+1);
}
}
}
int main()
{
ifstream f("strmatch.in");
f>>b>>a;
f.close();
KMP(a,b);
ofstream g("strmatch.out");
int po=in.size();
g<<po<<"\n";
for(int i=0;i<min(po,1000);i++)
g<<in[i]<<" ";
g<<"\n";
g.close();
return 0;
}