Cod sursa(job #1502135)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 14 octombrie 2015 11:12:18
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <string.h>
#include <algorithm>
#include <set>

#define dim 10000010
using namespace std;
ifstream fin("abc2.in");
ofstream fout("abc2.out");
int i,j,n,m,val,sol,nr,power,cod[dim];
char s[dim],c[22];
bool viz[dim];
set <int> cuv;
int binsrch(int x)
{
   int st=0,dr=n-m,mij;
   while(st<=dr)
   {
      mij=(st+dr)/2;
      if(x<=cod[mij])
         dr=mij-1;
      else
         if(x>cod[mij])
            st=mij+1;;
   }
   mij=(st+dr)/2;
   return mij;
}
int main()
{
   std::set<int>::iterator it;
   fin>>(s+1);
   fin>>(c+1);
   n=strlen(s+1);
   m=strlen(c+1);
   power=1;
   for(i=1;i<=m;i++)
   {
      nr=nr*3+s[i]-'a';
      val=val*3+c[i]-'a';
      power*=3;
   }
   power/=3;
   cuv.insert(val);
   for(i=m+1;i<=n;i++)
   {
      cod[i-m]=nr;
      nr=(nr-power*(s[i-m]-'a'))*3+s[i]-'a';
   }

   sort(cod+1,cod+n-m+1);

   while(fin>>(c+1))
   {
      val=0;
      for(i=1;i<=m;i++)
      {
         val=val*3+c[i]-'a';
      }
      cuv.insert(val);
   }
   for( it=cuv.begin();it!=cuv.end();it++)
   {
      i=binsrch(*it);
      i++;
      while(cod[i]==*it)
      {
         sol++;
         i++;
      }
   }
   fout<<sol;
    return 0;
}