Cod sursa(job #2474420)

Utilizator alex_bb8Banilean Alexandru-Ioan alex_bb8 Data 15 octombrie 2019 10:51:38
Problema Abc2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb

#include <bits/stdc++.h>

using namespace std;

ofstream g("abc2.out");
ifstream f("abc2.in");

const int mod=666013,mod1=19017;
long long p3[35],sol;
int n;
char v[10000205],s[35];
char x;

vector<int>M[mod],N[mod1];

void inser(int x)
{
  int poz=x%mod;
  bool ok=1;
  for(int i=0;i<M[poz].size();i++)
   if(M[poz][i]==x) ok=0;
  if(ok==1) M[poz].push_back(x);
  ok=1;

  int poz1=x%mod1;

  for(int i=0;i<N[poz1].size();i++)
   if(N[poz1][i]==x) ok=0;
  if(ok==1) N[poz1].push_back(x);
}


int query(int x)
{
  int poz=x%mod,u=0,u1=0,poz1=x%mod1;
  for(int i=0;i<M[poz].size();i++)
   if(M[poz][i]==x)
    u++;

  for(int i=0;i<N[poz1].size();i++)
   if(N[poz1][i]==x)
    u1++;

  u=min(u,u1);
  return u;
}


int main()
{
    p3[0]=1;
    for(int i=1;i<=21;i++)
     p3[i]=p3[i-1]*3;

    f>>v;
    for(int i=0;v[i];i++)
    {

     if(v[i]=='a') v[i]='0';
     else if(v[i]=='b') v[i]='1';
     else if(v[i]=='c') v[i]='2';

    }

    int nr=0;

    while(f>>s)
    {
     for(int i=0;s[i];i++)
     {
     nr+=(s[i]-'a')*p3[i];
     }
     inser(nr);
     //g<<nr<<"\n";
     nr=0;
     n=strlen(s);
    }

    //g<<"\n";
    nr=0;

    for(int j=0;j<=n-1;j++)
     nr+=(v[j]-'0')*p3[j];

    int upl=strlen(v);
    for(int j=n;j<upl;j++)
    {
     sol+=query(nr);
     //g<<query(nr)<<" ";
     //g<<nr<<"\n";
     nr=nr/3;
     nr+=(v[j]-'0')*p3[n-1];

    }

    g<<sol;
    return 0;
}