Cod sursa(job #1364530)

Utilizator VladuZ1338Vlad Vlad VladuZ1338 Data 27 februarie 2015 18:26:30
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin ("strmatch.in");
ofstream fout ("strmatch.out");

int pi[2000001];
char s[2000001], t[2000001];

void precalculare (char t[2000001], int pi[2000001])
{
    int i, m=strlen(t), k;
    pi[0]=0; k=0;
    for (i=1; i<m; i++)
    {  if (t[i]==t[k]) k++;
       else
        { while (k>0&&t[k]!=t[i]) k=pi[k-1];
          if (t[k]==t[i]) k++;
        }
       pi[i]=k;
    }
}

void kmp (char s[2000001], char t[2000001])
{
    int n=strlen(s), i, k=0, m=strlen(t), v[1001], nr=0;
    for (i=0; i<n; i++)
    { if(s[i]==t[k]) k++;
      else
        {  while (k>0&&t[k]!=s[i]) k=pi[k-1];
           if (t[k]==s[i]) k++;
        }
       if (k==m)
               {++nr;
                 if (nr<=1000) v[nr]=i-m+1;
                }
    }
    fout << nr << "\n";
    if (nr<=1000)
    {
        for (i=1; i<=nr; i++) fout << v[i] << " ";
    }
    else for (i=1; i<=1000; i++) fout << v[i] << " ";
}

int main()
{
    /*char s, t;
    toate aparitiile sirului t ca subsecventa a sirului s;
    s = ABACABABAC
    t = ABAC
    raspuns: 2
    strlen (s)=n;
    strlen (t)=m;
    alg naiv: O(n*m);
    pi[i]=lungimea maxima a unui sufix si prefix comun al sirului t0.....ti, care are lungime i-1.
    ex:
    t=ABACABABAC;
        0 1 2 3 4 5 6 7 8 9
    pi  0 0 1 0 1 2 3 2 3 4*/
    fin.getline (t, 2000001);
    fin.getline (s, 2000001);
    precalculare(t, pi);
    kmp(s, t);
}