Pagini recente » Cod sursa (job #2517892) | Cod sursa (job #1821599) | Cod sursa (job #3038148) | Cod sursa (job #2104478) | Cod sursa (job #2366265)
#include <fstream>
using namespace std;
ifstream fi ("kmp.in");
ofstream fo ("kmp.out");
string cuv,sir;
int pref[2000006],sol[2000006];
int nrsol;
void precalc()
{
int pozcuv,pozpref;
pref[0]=-1;
pozpref=-1;
for (pozcuv=1;pozcuv<cuv.size();pozcuv++)
{
while (pozpref>=0 and cuv[pozcuv]!=cuv[pozpref+1]) pozpref=pref[pozpref];
if (cuv[pozcuv]==cuv[pozpref+1]) pozpref++;
pref[pozcuv]=pozpref;
}
}
int main()
{
fi>>cuv>>sir;
precalc();
// for (int i=0;i<cuv.size();i++) fo<<pref[i];
int pozcuv=-1;
for (int pozsir=0;pozsir<sir.size();pozsir++)
{
while (pozcuv>=0 and cuv[pozcuv+1]!=sir[pozsir]) pozcuv=pref[pozcuv];
if (sir[pozsir]==cuv[pozcuv+1]) pozcuv++;
if (pozcuv==cuv.size()-1) {nrsol++;sol[nrsol]=pozsir-pozcuv;pozcuv=pref[pozcuv];}
}
for (int i=1;i<=min(nrsol,1000);i++) fo<<sol[i]<<' ';
return 0;
}