Pagini recente » Cod sursa (job #1456126) | Cod sursa (job #2131178) | Cod sursa (job #1861783) | Cod sursa (job #2102185) | Cod sursa (job #1408505)
#include <fstream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
#define NMAX 2000007
int pi[NMAX];
string str,pat;
int i;
vector < int > sol;
void bpi(string pat)
{
int k=0,i;
for (i=1;i<pat.size();++i)
{
for (;k && pat[k] != pat[i] ; k = pi[k-1]);
k += (pat[k] == pat[i]);
pi[i] = k;
}
}
vector < int > KMP(string str,string pat)
{
bpi(pat);
vector < int > ans;
int k=0,i;
for (i=0;i<str.size();++i)
{
for (;k && pat[k] != str[i];k = pi[k-1]);
k += (pat[k] == str[i]);
if (k==pat.size()) ans.push_back(i-pat.size()+1);
}
return ans;
}
int main()
{
ifstream f("strmatch.in");
ofstream g("strmatch.out");
f >> pat >> str;
sol = KMP(str,pat);
g << sol.size() << '\n';
for (i=0;i<min((int)sol.size(),1000);++i)
g << sol[i] << " ";
g << '\n';
return 0;
}