Pagini recente » Cod sursa (job #2912274) | Istoria paginii utilizator/adela.balasa | Cod sursa (job #1895556) | Cod sursa (job #797448) | Cod sursa (job #2009685)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
const int maxn = 2000005;
vector <int> sol;
string a, b;
int Z[maxn];
int st, dr;
int n;
void parcurgere(int i)
{
st = i;
while(dr < n && b[dr - st] == b[dr])
dr++;
Z[i] = dr - st;
dr--;
}
int main()
{
in >> a >> b;
b = a + "#" + b;
n = b.size();
Z[0] = b.size();
for(int i = 1; i < n; i++)
{
if(i > dr)
{
dr = i;
parcurgere(i);
}
else
{
int k = i - st;
if(Z[k] < dr - i + 1)
Z[i] = Z[k];
else
parcurgere(i);
}
}
for(int i = 1; i < n; i++)
if(Z[i] >= a.size())
sol.push_back(i);
for(unsigned int i = 0; i < min(1000U, sol.size()); i++)
out << sol[i] - a.size() - 1 << " ";
out << "\n";
return 0;
}