Pagini recente » Cod sursa (job #214143) | Cod sursa (job #351523) | Cod sursa (job #2077559) | Cod sursa (job #477821) | Cod sursa (job #728196)
Cod sursa(job #728196)
#include <fstream>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=2000005;
char t[maxn], p[maxn];
int l,n,m,x,nr;
int urm[maxn];
vector<int>poz;
void urmatorul(char *p)
{
//urm[k] cate litere din sufixul lui p[0..k] sunt prefixul lui P
int lung=-1;
urm[0]=-1;
for(x=1;x<n;x++) // parcurg prefixele de lungime x P[0..x]
{
//cattimp k>0 (lung este cate litere se potrivesc)
while(lung>0 && p[lung+1]!=p[x])
lung=urm[lung]; // eu stiu ca am potrivit lung litere din p
//
if(p[lung+1]==p[x])
lung++;
urm[x]=lung;
}
}
int cmp(int a, int b)
{
return a>b?0:1;
}
int main()
{
int i;
int x=-1;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
f.getline(p,maxn);
f.getline(t,maxn);
m=strlen(t);
n=strlen(p);
urmatorul(p);
for(i=0;i<m;i++)
{
while(x>0 && p[x+1]!=t[i])
x=urm[x];
if(p[x+1]==t[i]) //sirurile s-au potrivit
x++;
if(x==n-1)
{nr++;
if(nr<1000)
poz.push_back(i-m+1);
x=urm[x];
}
}
g<<nr<<"\n";
sort(poz.begin(), poz.end(), cmp);
for(i=0;i<nr &&i<1000; i++)
g<<poz[i]<<" ";
return 0;
}