Pagini recente » Cod sursa (job #270845) | Cod sursa (job #1438161) | Cod sursa (job #84049) | Cod sursa (job #2030942) | Cod sursa (job #2372514)
#include <fstream>
#include <string>
#include <vector>
#define NMAX 1000005
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
string original, pattern;
int N, M, prefix[NMAX];
vector < int > sol;
void Pref_Function()
{
int pivot = 0;
for(int i = 2; i <= M; i++)
{
while(pivot && pattern[pivot + 1] != pattern[i])
pivot = prefix[pivot];
if(pattern[pivot + 1] == pattern[i])
pivot++;
prefix[i] = pivot;
}
}
void KMP()
{
int pivot = 0;
for(int i = 1; i <= N; i++)
{
while(pivot && pattern[pivot + 1] != original[i])
pivot = prefix[pivot];
if(pattern[pivot + 1] == original[i])
pivot++;
if(pivot == M)
sol.push_back(i - M), pivot = prefix[pivot];
}
}
void Print_Sol()
{
out << sol.size() << "\n";
int t = sol.size();
for(unsigned i = 0; i < min(t, 1000); i++)
out << sol[i] << " ";
}
void Read_Data()
{
in >> pattern >> original;
N = original.size(), M = pattern.size();
original = ' ' + original, pattern = ' ' + pattern;
}
int main()
{
Read_Data();
Pref_Function();
KMP();
Print_Sol();
return 0;
}