Cod sursa(job #1407398)

Utilizator sddddgjdZloteanu Anastasia sddddgjd Data 29 martie 2015 18:38:35
Problema Potrivirea sirurilor Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.49 kb
#include<stdio.h>
#include<string.h>
#define P 112
#define MOD1 100007
#define MOD2 100021
#define N 100008
char a[N],st[N],dr[N];
int match[2][N],size[2];
void mmatch(char A[],int na,int nb,int care){
    int hashA1=0,hashA2=0,i,P1=1,P2=1,hash1=0,hash2=0;
    for(i=0;i<na;i++)
    {
        if(A[i]!=a[i])
            i++,i--;
        hashA1=(hashA1*P+A[i])%MOD1;
        hashA2=(hashA2*P+A[i])%MOD2;
        hash1=(hash1*P+a[i])%MOD1;
        hash2=(hash2*P+a[i])%MOD2;
        if(i!=0)
            P1=(P1*P)%MOD1,P2=(P2*P)%MOD2;
    }
    int cont=0;
    if(hash1==hashA1&&hash2==hashA2)
        match[care][cont++]=0;
    for(i=na;i<nb;i++)
    {
        hash1=((hash1-(a[i-na]*P1)%MOD1+MOD1)*P+a[i])%MOD1;
        hash2=((hash2-(a[i-na]*P2)%MOD2+MOD2)*P+a[i])%MOD2;
        if(hash1==hashA1&&hash2==hashA2)
            match[care][cont++]=i-na+1;
    }
    size[care]=cont;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("secv10.in","r");
    fout=fopen("secv10.out","w");
    int t;
    fscanf(fin,"%d ",&t);
    while(t){
        fscanf(fin,"%s %s %s ",a,st,dr);
        int i,na=strlen(a),nst=strlen(st),ndr=strlen(dr);
        mmatch(st,nst,na,0);
        mmatch(dr,ndr,na,1);
        int j1=0;
        long long sol=0;
        for(i=0;i<size[0];i++){
            while(j1<size[1]&&match[1][j1]+ndr-1<match[0][i]+nst-1)
                j1++;
            sol+=(size[1]-j1);
        }
        fprintf(fout,"%lld\n",sol);
        t--;
    }
    return 0;
}