Pagini recente » Cod sursa (job #2962195) | Cod sursa (job #3003216) | Cod sursa (job #2690615) | Cod sursa (job #911338) | Cod sursa (job #1889733)
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector<int> searchKMP(string txt, string pat);
vector<int> computeV(string pat);
ifstream fin("strmatch.in");
ofstream fout ("strmatch.out");
int main ()
{
string txt;
string pat;
vector<int> sol;
int n, i;
fin >> pat >> txt;
sol = searchKMP(txt,pat);
n = sol.size();
fout << n << '\n';
for(i=0; i<std::min(n,1000); i++)
fout << sol[i] << ' ';
}
vector<int> searchKMP(string txt, string pat)
{
int M = pat.size();
int N = txt.size();
vector<int> V = computeV(pat);
vector<int> sol;
int i=0;
int j=0;
while( i< N)
{
if(pat[j] == txt[i])
{
i++;
j++;
}
if(j == M)
{
sol.push_back(i-M);
j = V[j-1];
}
else
if(i <N &&pat[j] != txt[i])
{
if(j!=0)
j = V[j-1];
else
i++;
}
}
return sol;
}
vector<int> computeV(string pat)
{
int M = pat.size();
vector<int> V(M);
V[0] = 0;
int i= 1;
int len = 0;
while(i < M)
{
if(pat[i] == pat[len])
{
len++;
V[i] = len;
i++;
}
else
if(len != 0)
len = V[len -1];
else
{
V[i] = 0;
i++;
}
}
return V;
}