Pagini recente » Cod sursa (job #2808763) | Cod sursa (job #1231116) | Cod sursa (job #2966379) | Cod sursa (job #3228661) | Cod sursa (job #1407398)
#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;
}