Cod sursa(job #927268)

Utilizator RaduDoStochitoiu Radu RaduDo Data 25 martie 2013 18:21:05
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<fstream>
#include<string.h>
#include<vector>
#define nMax 1000
#define mMax 255
using namespace std;
vector <int> sol;

int Urm[mMax];
char T[nMax], P[mMax];
int n, m;

void Urmatorul(char *P)
{
    int k=-1, x;
    Urm[0]=0;
    for(x=1; x<m; ++x)
    {
        while(k>0 && P[k+1]!=P[x])  k=Urm[k];
        if(P[k+1] == P[x])  k++;
        Urm[x]=k;
    }
}

int main()
{
    int i, x=-1;
    ifstream f("KMP.in");
    ofstream g("KMP.out");
    f.getline(P, 255); f.getline(T, 1000);
    n=strlen(T);    m=strlen(P);
    Urmatorul(P);
    for(i=0; i<n; ++i)
    {
        while(x>0 && P[x+1]!=T[i])  x=Urm[x];
        if(P[x+1] == T[i])  x++;
        if(x == m-1)
        {
            sol.push_back(i-m+1);
            x=Urm[x];
        }
    }
    g<<sol.size()<<"\n";
    for(i=0; i<sol.size(); ++i)
        g<<sol[i]<<" ";
    g.close();
    return 0;
}