Pagini recente » Cod sursa (job #684127) | Cod sursa (job #2970126) | Cod sursa (job #2172773) | Cod sursa (job #2883813) | Cod sursa (job #1833015)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
void print_occurs(string needle, string haystack)
{
int needle_index = 0;
int n = (int)needle.size(), m = (int)haystack.size();
struct prefix
{
int current_index;
prefix *next;
}*root = new prefix(), *p = root;
root ->next = 0;
int nr_of_prefixes = 0;
while (needle_index < n)
{
if (nr_of_prefixes == 0)
{
for(int i = 0; i < m; i++)
if (haystack[i] == needle[needle_index])
{
p -> next = new prefix();
p = p -> next;
p -> current_index = i+1;
p -> next = 0;
nr_of_prefixes++;
}
}
else
{
p = root;
while(p->next != 0)
{
if((p->next->current_index < m) &&(haystack[p->next->current_index++] != needle[needle_index]))
{
nr_of_prefixes--;
p -> next = p->next->next;
delete p->next;
}
else
p = p->next;
}
}
needle_index++;
}
ofstream g("strmatch.out");
g << nr_of_prefixes << '\n';
int printed = 0;
for (p = root; p->next != 0; p = p->next)
{
g << p->next->current_index-n << ' ';
printed++;
if(printed == 1000)
break;
}
g.close();
p = root;
delete root;
}
int main()
{
string haystack, needle;
ifstream f("strmatch.in");
getline(f, needle);
getline(f, haystack);
print_occurs(needle, haystack);
f.close();
return 0;
}