Pagini recente » Cod sursa (job #172379) | Profil M@2Te4i | Cod sursa (job #2246987) | Cod sursa (job #1593640) | Cod sursa (job #2009892)
#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 * 2];
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();
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++)
cerr << Z[i] << " ";
for(int i = 1; i < n; i++)
if(Z[i] == a.size())
sol.push_back(i);
for(unsigned int i = a.size() + 1; i < min(1000U, sol.size()); i++)
out << sol[i] - a.size() << " ";
out << "\n";
return 0;
}