Pagini recente » Cod sursa (job #1608825) | Cod sursa (job #1878317) | Cod sursa (job #475967) | Cod sursa (job #2623069) | Cod sursa (job #2707639)
#include<fstream>
#include<string.h>
#include<vector>
using namespace std;
const int LIM = 2000010;
char txt[LIM], pat[LIM];
int lps[LIM];
vector<int> sol;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
void preproces_lps(char* pat, int M, int* lps)
{
int len = 0;
lps[0] = 0;
int i = 1;
while (i < M)
if (pat[i] == pat[len])
{
len++;
lps[i] = len;
i++;
}
else
if (len != 0)
len = lps[len - 1];
else
{
lps[i] = 0;
i++;
}
}
void pat_search(char* pat, char* txt)
{
int m = strlen(pat);
int n = strlen(txt);
int i = 0, j = 0;
preproces_lps(pat, m, lps);
while (i < n)
{
if (pat[j] == txt[i])
{
i++;
j++;
}
if (j == m)
{
sol.push_back(i - j);
j = lps[j - 1];
}
else
if (i < n && pat[j] != txt[i])
{
if (j != 0)
j = lps[j - 1];
else
i++;
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
f.tie(NULL);
f.getline(pat, LIM);
f.getline(txt, LIM);
pat_search(pat, txt);
g << sol.size() << endl;
int nr = sol.size();
if (nr > 1000)
nr = 1000;
for (int i=0;i<nr;i++)
g << sol[i] << " ";
}
/*
ABABDABACDABABCABAB
ABABCABAB
*/