Pagini recente » Cod sursa (job #3231915) | Cod sursa (job #494322) | Cod sursa (job #2817046) | Cod sursa (job #2989810) | Cod sursa (job #2195306)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
char s[2000001],p[2000001];
int badCharacter[256];
int sol[1001],nrElemente;
void calculCaracterRau()
{
for(int i=0;i<256;++i) badCharacter[i]=-1;
for(int i=0;i<strlen(p);++i) badCharacter[(int) p[i]]=i;
}
void BoyerMoore()
{
int lg_s=strlen(s);
int lg_p=strlen(p);
calculCaracterRau();
int i=0;
while( i <= (lg_s-lg_p) )
{
int j=lg_p-1;
while(j>=0 && s[i+j]==p[j]) j--;
if(j<0)
{
if(nrElemente<1000) sol[nrElemente++]=i;
else nrElemente++;
if(i+lg_p < lg_s) i+=lg_p - badCharacter[(int) s[i+lg_p]];
else i++;
}
else i+=max(1,j-badCharacter[(int) s[i+j]]);
}
}
int main()
{
fin.getline(p,2000001);
fin.getline(s,2000001);
BoyerMoore();
fout<<nrElemente<<"\n";
if(nrElemente>1000) nrElemente=1000;
for(int i=0;i<nrElemente;++i) fout<<sol[i]<<" ";
return 0;
}