Pagini recente » Cod sursa (job #1639620) | Cod sursa (job #264785) | Cod sursa (job #2032920) | Cod sursa (job #2431453) | Cod sursa (job #609766)
Cod sursa(job #609766)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
#define MAX 2000001
ifstream fi;
ofstream fo;
char a[MAX];
char b[MAX];
int lena;
int lenb;
int k;
int q;
int pi[MAX];
vector<int> sol;
int main()
{
// citire
fi.open("strmatch.in");
fi >> a;
fi >> b;
fi.close();
lena = strlen(a);
lenb = strlen(b);
// prefix
k = 0;
pi[1] = 0;
for (int i=2; i<=lena; ++i)
{
while ((k > 0) && (a[k] != a[i-1]))
k = pi[k];
if (a[k] == a[i-1])
++k;
pi[i] = k;
}
// kmp
k = 0;
q = 0;
for (int i=1; i<=lenb; ++i)
{
while ((q>0) && (a[q] != b[i-1]))
q = pi[q];
if (a[q] == b[i-1])
++q;
if (q == lena)
{
sol.push_back(i - lena);
++k;
q = pi[q];
}
}
// tiparire
fo.open("strmatch.out");
fo << k << "\n";
vector<int>::iterator it;
q = 0;
for (it = sol.begin(); it != sol.end(); ++it)
{
fo << *it << " ";
++q;
if (q==1000)
break;
}
fo.close();
return 0;
}