Pagini recente » Cod sursa (job #2278314) | Cod sursa (job #2784948) | Cod sursa (job #1533898) | Cod sursa (job #287419) | Cod sursa (job #350751)
Cod sursa(job #350751)
#include<fstream>
#define dmax 2000003
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
char t[dmax],p[dmax];
long int n,m,urm[dmax];
void geturm()
{ long int i,k=-1;
urm[0]=0;
for(i=1;i<m;i++)
{ while(k>0 && p[k+1]!=p[i])
k=urm[k];
if(p[k+1]==p[i])
k++;
urm[i]=k;
}
}
void solve(int k)
{ long int i,x=-1,nr=0;
for(i=0;i<n;i++)
{ while(x>0 && t[i]!=p[x+1])
x=urm[x];
if(t[i]==p[x+1])
x++;
if(x==m-1)
{ nr++;
if(k==1 && nr<=1000)
out<<i-m+1<<" ";
x=urm[x];
}
}
if(k==0)
out<<nr<<'\n';
}
int main()
{ long int i,x=-1;
in.getline(p,dmax,'\n');
in.getline(t,dmax,'\n');
in.close();
n=strlen(t);
m=strlen(p);
geturm();
solve(0);
solve(1);
out.close();
return 0;
}