Cod sursa(job #1013565)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 21 octombrie 2013 10:21:34
Problema Potrivirea sirurilor Scor 16
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <string.h>

#define N 2000003
char str[N],pattern[N]; 
int prev[N];

int main ()
{
    int istr,ipattern;
    int lstr,lpattern; 
    std::vector<int> result;
    FILE *fin=fopen("strmatch.in","r");
    FILE *fout=fopen("strmatch.out","w");
    fgets(pattern+1,N,fin);
    fgets(str+1,N,fin);
    lstr=strlen(str+1)-1;
    lpattern=strlen(pattern+1)-1;
    if(lstr<lpattern)
    {   fprintf(fout,"0");
        return 0;
    }
    /*0 1 2 0 1 0 0 0 
    str
    strsstr
    */
    int k=0;
    for(ipattern=1;ipattern<=lpattern;ipattern++)
    {
        if(pattern[k+1]==pattern[ipattern+1])
        {   
            prev[ipattern+1]=k+1;
            k++;
        }   
        else
        {  
            do
            {
                k=prev[k]; 
                if(pattern[k+1]==pattern[ipattern+1])
                {
                    prev[ipattern+1]=k+1;
                    k++;
                    break;
                } 
            }
            while(k!=0);
        }
    }
    ipattern=0;
    for(istr=0;istr<=lstr;istr++)
    {
        //printf("%d %d\n",istr,ipattern);
        if(str[istr+1]==pattern[ipattern+1])
        {
            ipattern++;  
            if(ipattern==lpattern)
            {
                result.push_back(istr+1-lpattern);
                ipattern=prev[ipattern];
            } 
        }
        else
        {
            ipattern=prev[ipattern];
            do
            {
                if(str[istr+1]==pattern[ipattern+1])
                {   
                    ipattern++;    
                    if(ipattern==lpattern)
                    {   
                        printf("asd\n");
                    }
                    break;
                }   
                ipattern=prev[ipattern];
            }
            while(ipattern>0); 
        }
    }
    fprintf(fout,"%d\n",result.size());
    for(int i=0;i<result.size();i++)
    {   
        fprintf(fout,"%d ",result[i]);
    }
    fclose(fin);  
    fclose(fout);  
    return 0;
}