Cod sursa(job #1515652)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 1 noiembrie 2015 23:01:41
Problema Potrivirea sirurilor Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>
#define BAZA 52
#define MOD 1999999973
#define lg 2000000
char a[lg],b[lg],ch;
int v[1000];
int CONV(){
    if(ch>='a'&&ch<='z')
        return ch-'a'+1;
    else
        return 27+ch-'A';
}
int verific(int m,int n){
    int i,j,pp=0;
    for(i=n,j=m-n+1;i<=n;i++,j++)
        if(a[i]!=b[j])
            pp=1;
    if(pp==0)
        return m-n-1;
    else
        return -1;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("strmatch.in","r");
    fout=fopen("strmatch.out","w");
    int n,m,i,nra,nrb,cate,poz;
    int PUT=1;
    n=0;
    nra=0;
    ch=fgetc(fin);
    while(ch!='\n'){
        a[n]=ch;
        n++;
        nra=nra*BAZA+CONV();
        nra%=MOD;
        PUT=(PUT*BAZA)%MOD;
        ch=fgetc(fin);
    }
    PUT/=BAZA;
    n--;
    m=0;
    nrb=0;
    while(m<=n){
        ch=fgetc(fin);
        b[m]=ch;
        m++;
        nrb=nrb*BAZA+CONV();
        nrb%=MOD;
    }
    cate=-1;
    ch=fgetc(fin);
    while(ch!='\n'){
        if(nra==nrb){
            poz=verific(m,n);
            if(poz>=0){
                cate++;
                if(cate<1000)
                    v[cate]=poz;
            }
        }
        b[m]=ch;
        m++;
        nrb%=PUT;
        nrb=nrb*BAZA+CONV();
        nrb%=MOD;
        ch=fgetc(fin);
    }
    fprintf(fout,"%d\n",cate+1);
    for(i=0;i<=cate;i++)
        fprintf(fout,"%d ",v[i]);
    fclose(fin);
    fclose(fout);
    return 0;
}