Cod sursa(job #1925587)

Utilizator firewavesBirsu Ion firewaves Data 13 martie 2017 13:57:12
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
//ifstream fin("strmatch.in");
//ofstream fout("strmatch.out");
int main()
{
    string a, b;
    cin >> a >> b;
    vector<int> pos;
    if(a.size() > b.size()){
        cout<< "0";
        return 0;
    }
    unsigned int i = 0, j = 0;
    unsigned int aux[a.size()];
    aux[0] = 0;
    for(i = 1; i < a.size(); i++) {
        if(a[j] != a[i]) {
            if(j == 0) {
                    aux[i] = 0;
                continue;
            }
            else {
                j = aux[j-1];
                i--;
            }
        }
        else {
            j++;
            aux[i] = j;
        }
    }
    j = 0;
    while( i < b.size()) {
        if( j == a.size()) {
            pos.push_back(i - j);
            j = aux[j - 1];
            if(pos.size() == 1000)
                break;
        }

        if(a[j] == b[i]){
            j++;
            i++;
        }

        else {
            if(j == 0)
                i++;
            else {
                j = aux[j-1];
            }
        }
    }

    if(j == a.size())
        pos.push_back(i - j );
    cout << pos.size() << endl;
    for(int p :pos)
        cout << p << " ";
    return 0;
}