Cod sursa(job #1518386)

Utilizator lauratalaatlaura talaat lauratalaat Data 5 noiembrie 2015 21:18:04
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n1=100007,n2=100021,b=3;
struct bine { int numar1 , numar2 ;};
bine v[50001],v2[50001];
bool sortare ( bine a , bine b ){
    if(a.numar1!=b.numar1)
        return a.numar1<b.numar1;
    return a.numar2<b.numar2;
}
int k,k2;
char s[10000001],s1[21];
int gasire( int a1 , int b1){
    int pp,i,cas=0;
    pp=1;
    for(i=1;i<=k2&&v2[i].numar1<=a1;i++)
        if(v2[i].numar1==a1&&v2[i].numar2==b1)
            cas++;
    return cas;
}
int main(){
    int nr1,nr2,p1,p2,n,i,k1,nnr1,nnr2,r,cate,j;
    freopen("abc2.in","r",stdin);
    freopen("abc2.out","w",stdout);
    scanf("%s",&s);k=0;
    nr1=nr2=0;
    p1=p2=1;
    while(scanf("%s",&s1)!=EOF){
        n=strlen(s1); nr1=nr2=0; p1=p2=1;
        for(i=0;i<n;i++){
            nr1=((nr1*b)%n1+s1[i]-'a'+1)%n1;
            nr2=((nr2*b)%n2+s1[i]-'a'+1)%n2;
            if(i!=0){
                p1=(p1*b)%n1;
                p2=(p2*b)%n2;
            }
        }
        k++;
        v[k].numar1=nr1;
        v[k].numar2=nr2;
    }
    sort(v+1,v+k+1,sortare);
    k1=n;
    n=strlen(s);
    nnr1=nnr2=0;
    k2=0;cate=0;
    for(i=0;i<k1;i++){
        nnr1=((nnr1*b)%n1+s[i]-'a'+1)%n1;
        nnr2=((nnr2*b)%n2+s[i]-'a'+1)%n2;
    }
    k2++;
    v2[k2].numar1=nnr1;
    v2[k2].numar2=nnr2;
    for(i=0,j=k1;j<n;i++,j++){
        nnr1=((((nnr1-((s[i]-'a'+1)*p1))*b)%n1+n1)%n1+(s[j]-'a'+1))%n1;
        nnr2=((((nnr2-((s[i]-'a'+1)*p2))*b)%n2+n2)%n2+(s[j]-'a'+1))%n2;
        k2++;
        v2[k2].numar1=nnr1;
        v2[k2].numar2=nnr2;
    }
    sort(v2+1,v2+k2+1,sortare);
    for(i=1;i<=k;i++){
        if(v[i].numar1!=v[i-1].numar1){
            r=gasire(v[i].numar1,v[i].numar2);
            cate+=r;
        }
    }
    printf("%d\n",cate);
    return 0;
}