Pagini recente » Cod sursa (job #2932596) | Cod sursa (job #1271322) | Cod sursa (job #1540801) | Cod sursa (job #2322270) | Cod sursa (job #2910627)
#include <bits/stdc++.h>
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
const int N = 2000005;
char A[N],B[N];
int p[N],nrPotriviri,potriviri[1001];///p=functia prefix
int main()
{
f>>A+1>>B+1;
int n=strlen(A+1);
int m=strlen(B+1);
/// pasul 1 - calculul functiei prefix
int q=0;
for(int i=2;i<=n;i++)
{
while(q>0&&A[i]!=A[q+1])q=p[q];
if(A[i]==A[q+1])q++;
p[i]=q;
}
/// pasul 2 - algoritmul KMP de determinare a potrivirilor
q=0;
for(int i=1;i<=m;i++)
{
if(q>0&&B[i]!=A[q+1])q=0;
if(B[i]==A[q+1])q++;
if(q==n)///am gasit o potrivire
{
nrPotriviri++;
if(nrPotriviri<=1000)
potriviri[nrPotriviri]=i-n;
}
}
///afisare
g<<nrPotriviri<<'\n';
if(nrPotriviri>1000)
nrPotriviri=1000;
for(int i=1;i<=nrPotriviri;i++)
g<<potriviri[i]<<' ';
return 0;
}