Cod sursa(job #1984746)

Utilizator victoreVictor Popa victore Data 25 mai 2017 21:18:44
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<cstdio>
#include<vector>
#include<cstring>
#define key(a) (a%666013)

using namespace std;

const int nmax=1e7+5;
const int mod=666013;

vector<int> g[mod+2];

char mainu[nmax],pat[25];

inline int get_num(char ch)
{
    return ch-'a';
}
inline vector<int>::iterator find_num(int n)
{
    int cheie=key(n);
    vector<int>::iterator it;
    for(it=g[cheie].begin();it!=g[cheie].end();++it)
        if(*it==n)
            return it;
    return g[cheie].end();
}
inline int erase_num(int n)
{
    int cheie=key(n),cnt=0;
    vector<int>::iterator it=find_num(n);
    while(it!=g[cheie].end())
    {
        g[cheie].erase(it);
        it=find_num(n);
        cnt++;
    }
    return cnt;
}


int main()
{
    freopen("abc2.in","r",stdin);
    freopen("abc2.out","w",stdout);
    int cmp=0,num=0,putere=1,lpat,n,i,cnt=0;
    char cu;
    gets(mainu+1);
    n=strlen(mainu+1);
    gets(pat+1);
    lpat=strlen(pat+1);
    cmp=num=0;
    for(i=1;i<=lpat;i++)
    {
        cmp=cmp*3+get_num(pat[i]);
        num=num*3+get_num(mainu[i]);
        putere*=3;
    }
    putere/=3;
    g[key(num)].push_back(num);
    for(i=lpat+1;i<=n;i++)
    {
        num=(num-putere*get_num(mainu[i-lpat]))*3+get_num(mainu[i]);
        g[key(num)].push_back(num);
    }
    cnt+=erase_num(cmp);
    while(scanf("%c",&cu)!=EOF)
    {
        gets(pat+2);
        pat[1]=cu;
        cmp=0;
        for(i=1;i<=lpat;i++)
            cmp=cmp*3+get_num(pat[i]);
        cnt+=erase_num(cmp);
    }
    printf("%d",cnt);
}