Pagini recente » Cod sursa (job #2441111) | Cod sursa (job #986478) | Cod sursa (job #1088799) | Cod sursa (job #91590) | Cod sursa (job #2480894)
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#define ceva 2000003
using namespace std;
char a[ceva],b[ceva];
int n,m,pref[ceva],nr;
vector<int>sol;
void citire()
{
a[0]=b[0]='*';
ifstream fin("strmatch.in");
fin>>a+1>>b+1;
n=strlen(a+1);
m=strlen(b+1); cout<<n<<" "<<m<<"\n"; cout<<a<<"\n"<<b<<"\n";
}
void prefix()
{
pref[1]=0;
for(int i=2;i<=n;i++)
{
int j=i-1;
while(j)
{
if(a[i]==a[pref[j]+1])
{
pref[i]=pref[j]+1;
break;
}
j=pref[j-1];
}
}
for(int i=0;i<=n;i++)
cout<<pref[i]<<" ";
cout<<"\n";
}
void kmp()
{
int nrc=1;
for(int i=1;i<=m;i++)
{
if(b[i]==a[nrc])
{
nrc++;
if(nrc==n+1)
{
nrc=pref[n]+1;
sol.push_back(i-n);
nr++;
}
}
else
{
nrc--;
while(b[i]!=a[nrc+1]&&nrc>0)
nrc=pref[nrc];
if(b[i]==a[nrc+1])
nrc+=2;
else
nrc=1;
}
}
cout<<nr;
}
void afisare()
{
ofstream fout("strmatch.out");
fout<<nr<<"\n";
if(nr>1000)
nr=1000;
for(int i=0;i<nr;i++)
fout<<sol[i]<<" ";
}
int main()
{
citire();
prefix();
kmp();
afisare();
return 0;
}