Cod sursa(job #1508633)

Utilizator alex.craciunCraciun Alexandru alex.craciun Data 22 octombrie 2015 19:44:56
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char s[2000010],p[2000010];
int pref[2000010],pozitie[2000010];
int k=0;

void pattern(int lp)
{
    int i,j;
    pref[0]=0;
    i=1;
    j=0;

    while(i<lp)
        if(p[i]==p[j])
        {
            pref[i]=j+1;
            i++,j++;
        }
        else if(j==0)
            pref[i++]=0;
        else
            j=pref[j-1];

}
int nrap;
int strmatch(int ls,int lp)
{
    int i=0,j=0;

    while(i<ls)
        if(s[i]==p[j])
        {
            i++;
            j++;
            if(j==lp)
            {
                nrap++;
                pozitie[++k]=i-lp;
                j=pref[j-1];
            }
        }
        else if(j==0)
            i++;
        else
            j=pref[j-1];

    return nrap;

}

int main()
{

    FILE *f=fopen("strmatch.in","r");
    fscanf(f,"%s\n%s",p,s);
    int ls=strlen(s);
    int lp=strlen(p);
    pattern(lp);
    f=fopen("strmatch.out","w");
    fprintf(f,"%d\n",strmatch(ls,lp));
    if(k>1000)
        k=1000;
    for(int i=1; i<=k; i++)
        fprintf(f,"%d ",pozitie[i]);


    return 0;
}