Pagini recente » Cod sursa (job #2384355) | Cod sursa (job #960920) | Cod sursa (job #2151048) | Cod sursa (job #85892) | Cod sursa (job #2391435)
#include <iostream>
#include <fstream>
#include <cstring>
#define Nmax 200000
using namespace std;
void make_prefix(char A[] , int pi[], int lungA)
{
int i, q =0;
for( i = 2 , pi[1] = 0; i <= lungA ; i++)
{
while(q && A[q+1] != A[i])
q = pi[q];
if(A[q+1] == A[i])
q++;
pi[i] = q;
}
}
int main()
{
char A[Nmax];
char B[Nmax];
int pi[Nmax] , pos[1024];
ifstream in("strmatch.in");
ofstream out("strmatch.out");
in.getline(A,Nmax);
in.getline(B, Nmax);
cout<<A<<endl<<B<<endl;
int lungA = strlen(A);
int lungB = strlen(B);
for(int i = lungA ; i > 0 ; i--)
A[i] = A[i-1];
for(int j = lungB ; j > 0 ; j--)
B[j]= B[j-1];
A[0]=' ';
B[0]=' ';
make_prefix(A , pi, lungA );
int q = 0,n=0;
for(int i = 1 ;i <= lungB ; i++)
{
while(q && A[q+1] != B[i])
q= pi[q];
if(A[q+1] == B[i])
q++;
if(q == lungA)
{
q = pi[lungA];
pos[++n] = i - lungA;
}
}
for(int i = 1 ;i<=n ;i++)
out<<pos[i]<<" ";
return 0;
}