Pagini recente » Cod sursa (job #2153612) | Cod sursa (job #2838247) | Cod sursa (job #2554941) | Cod sursa (job #1790621) | Cod sursa (job #2802563)
#include <bits/stdc++.h>
#define nmax 100001
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
int kmp[nmax],pa[nmax];
string a,b;
int main()
{
f>>b>>a;
cout<<"here"<<a<<' '<<b<<'\n';
kmp[0]=-1; // nu avem nimic inainte
for(int i=1;i<b.size();i++)
{
int x=kmp[i-1];
while(x!=-1&&b[i]!=b[x+1]) x=kmp[x];
if(x==-1)
{
if(b[i]==b[0])kmp[i]=0;
else kmp[i]=-1;
}
else kmp[i]=x+1;
//cout<<kmp[i]<<' ';
}
//cout<<'\n';
pa[0]=(a[0]==b[0]?0:-1);
vector<int> ans;
//cout<<pa[0]<<' ';
for(int i=1;i<a.size();i++)
{
int x=pa[i-1];
while(a[i]!=b[x+1]&&x!=-1) x=kmp[x];
//cout<<x<<',';
if(x==-1)
{
if(a[i]==b[0]) pa[i]=0;
else pa[i]=-1;
}
else
pa[i]=x+1;
if(pa[i]==b.size()-1) ans.push_back(i+1);
//cout<<pa[i]<<' ';
}
g<<ans.size()<<'\n';
for(int i=0;i<min((int)ans.size(),1000);i++) g<<ans[i]-b.size()<<' ';
}