Pagini recente » Cod sursa (job #313075) | Cod sursa (job #3273208) | Cod sursa (job #352457) | Cod sursa (job #538084) | Cod sursa (job #1364530)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout ("strmatch.out");
int pi[2000001];
char s[2000001], t[2000001];
void precalculare (char t[2000001], int pi[2000001])
{
int i, m=strlen(t), k;
pi[0]=0; k=0;
for (i=1; i<m; i++)
{ if (t[i]==t[k]) k++;
else
{ while (k>0&&t[k]!=t[i]) k=pi[k-1];
if (t[k]==t[i]) k++;
}
pi[i]=k;
}
}
void kmp (char s[2000001], char t[2000001])
{
int n=strlen(s), i, k=0, m=strlen(t), v[1001], nr=0;
for (i=0; i<n; i++)
{ if(s[i]==t[k]) k++;
else
{ while (k>0&&t[k]!=s[i]) k=pi[k-1];
if (t[k]==s[i]) k++;
}
if (k==m)
{++nr;
if (nr<=1000) v[nr]=i-m+1;
}
}
fout << nr << "\n";
if (nr<=1000)
{
for (i=1; i<=nr; i++) fout << v[i] << " ";
}
else for (i=1; i<=1000; i++) fout << v[i] << " ";
}
int main()
{
/*char s, t;
toate aparitiile sirului t ca subsecventa a sirului s;
s = ABACABABAC
t = ABAC
raspuns: 2
strlen (s)=n;
strlen (t)=m;
alg naiv: O(n*m);
pi[i]=lungimea maxima a unui sufix si prefix comun al sirului t0.....ti, care are lungime i-1.
ex:
t=ABACABABAC;
0 1 2 3 4 5 6 7 8 9
pi 0 0 1 0 1 2 3 2 3 4*/
fin.getline (t, 2000001);
fin.getline (s, 2000001);
precalculare(t, pi);
kmp(s, t);
}