Cod sursa(job #1653931)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 16 martie 2016 18:17:42
Problema Abc2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <limits>
#include <numeric>
#include <cstring>
#include <string>
#include <queue>
#include <set>
#include <cmath>
#include <fstream>
#include <cstdlib>
#include <map>
#define pb push_back
#define mp make_pair
#define INF numeric_limits<int>::max()
#define bit(x) (-x)&x
#define int64 long long
using namespace std;
ifstream in("abc2.in");
ofstream out("abc2.out");
string s,x;
#define mod1 66013
#define mod2 57697
#define P 3
vector< vector<int> > h(mod1);
bool v[22];
void ins(int c1,int c2)
{
    for(int i=0;i<(int)h[c1].size();i++)
    if(h[c1][i]==c2)
        return;
    h[c1].pb(c2);
}
int ok(int c1,int c2)
{
    for(int i=0;i<(int)h[c1].size();i++)
        if(h[c1][i]==c2)
        return 1;
    return 0;
}
int countWords(int m)
{
    int p1=1,p2=1,c1=0,c2=0,cnt=0;
    for(int i=m-1;i>=0;i--)
    {
        c1=(c1+s[i]*p1)%mod1;
        c2=(c2+s[i]*p2)%mod2;
        if(i!=0)
        {
            p1=(p1*P)%mod1;
            p2=(p2*P)%mod2;
        }
    }
    cnt+=ok(c1,c2);
    for(int i=m;i<(int)s.size();i++)
    {
        c1=((c1-(s[i-m]*p1)%mod1+mod1)*P+s[i])%mod1;
        c2=((c2-(s[i-m]*p2)%mod2+mod2)*P+s[i])%mod2;
        cnt+=ok(c1,c2);
    }
    return cnt;
}
int main()
{
    in>>s;
    while(in>>x)
    {
        if(v[x.size()]==false)
            v[x.size()]=true;
        int p1=1,p2=1,c1=0,c2=0;
        for(int i=x.size()-1;i>=0;i--)
        {
            c1=(c1+p1*x[i])%mod1;
            c2=(c2+p2*x[i])%mod2;
            p1=(P*p1)%mod1;
            p2=(P*p2)%mod2;
        }
        ins(c1,c2);
    }
    int sol=0;
    for(int i=1;i<=20;i++)
    if(v[i]==true)
        sol+=countWords(i);
    out<<sol<<'\n';
    return 0;
}