Cod sursa(job #107598)

Utilizator mariusdrgdragus marius mariusdrg Data 20 noiembrie 2007 01:05:33
Problema Abc2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include<stdio.h>

#include<vector>

#define vpi vector <int >
#define vpii vector <int > :: iterator
#define mkp make_pair
#define ss second
#define pb push_back
#include<algorithm>
const int maxl = 21;
const int maxalf = 3;
const int maxn = 600100;
const int lemax = 10000100;


using namespace std;

int aut[maxn][maxalf];
int trie[maxn][maxalf];
char a[lemax];
int i;
char s[maxl];
int k;
int j;
int tata[maxn];
char tatam[maxn];
int nst;
char niv[maxn];
vpi vect[maxl + 2];
int lung;
bool ver;
int m;


int main()
{
        freopen("abc2.in","r",stdin);
        freopen("abc2.out","w",stdout);
        fgets(a,lemax,stdin);
        int n = strlen(a) - 2;
        int cur;
        nst = 1;
        vect[0].pb(1);
        while(!feof(stdin))
        {
                ++m;
                fgets(s,30,stdin);
                lung = strlen(s) - 2;
                cur = 1;
                for(i = 0;i <= lung;++i)
                {
                        if (!trie[cur][s[i] - 'a'])
                        {
                                ++nst;
                                trie[cur][s[i] - 'a'] = nst;
                                tata[nst] = cur;
                                tatam[nst] = s[i] - 'a';
                                niv[nst] = niv[cur] + 1;
                                vect[niv[nst]].pb(nst);
                        }
                        cur = trie[cur][s[i] - 'a'];
                }
        }

//        sort(vect.begin(),vect.end());
        
        for(i = 0;i <= 2; ++i)
        {
                aut[1][i] = 1;
        }
        for(i = 1;i <= lung + 1; ++i)
        {
               for(vpii it = vect[i].begin(); it != vect[i].end(); ++it)
               {
                        int st = (*it);
                        int ant = aut[tata[st]][tatam[st]];
                        memcpy(aut[st],aut[ant],sizeof(aut[ant]));
                        if (niv[tata[st]] == niv[ant])
                        {
                                for(j = 0;j <= 2; ++j)
                                {
                                        if (trie[ant][j]) aut[st][j] = trie[ant][j];
                                }
                        }
                        aut[tata[st]][tatam[st]] = st;
               }
        }

        int st = 1;
        int ans = 0;

        for(i = 0;i <= n; ++i)
        {
                st = aut[st][a[i] - 'a'];
                if (trie[st][0] == 0 && trie[st][1] == 0 && trie[st][2] == 0)
                {
                        ++ans;
                }
        }

        printf("%d\n",ans);

        return 0;
}