Cod sursa(job #663072)

Utilizator psycho21rAbabab psycho21r Data 17 ianuarie 2012 19:42:23
Problema Potrivirea sirurilor Scor 18
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    string s, w;
    vector <int> sol;
    ifstream in("strmatch.in");
    in >> w >> s;
    in.close();

    int back = 0, pos = 2, w_size = w.size(), s_size = s.size(), pattern[2000];
    pattern[0] = -1;
    pattern[1] = 0;

    while (pos < w.size())
    {
        if(w[pos-1] == w[back])
        {
            ++back;
            pattern[pos] = back;
            ++pos;
        }
        else
        if(back > 0)
            back = pattern[back];
        else
        {
            pattern[pos] = 0;
            ++pos;
        }
    }

    for (int i = 0; i < 3; ++i)
        cout << pattern[i] << " ";


    int now = 0, i = 0;

    while (now + i < s_size)
    {
        if(w[i] == s[now+i])
        {
            if(i == w_size - 1)
            {
                sol.push_back(now);
                now = now + i - pattern[i];
                i = pattern[i];
            }
            else
                ++i;
        }
        else
        {
            now = now + i - pattern[i];
            if(pattern[i] > -1)
                i = pattern[i];
            else
                i = 0;
        }

    }

    ofstream out("strmatch.out");
    out << sol.size() << "\n";
    int f = min(1000, int(sol.size()));
    for (int q = 0; q < f; ++q)
        out << sol[q];
    out.close();
    return 0;
}