Cod sursa(job #472234)

Utilizator darrenRares Buhai darren Data 23 iulie 2010 15:10:22
Problema Restante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <algorithm>
#include <string>

using namespace std;

const int SIZE = 36001;

ifstream fin("restante.in");
ofstream fout("restante.out");

void Read();
void Solve();
void Write();

int n, res;
int v[SIZE][26], in[SIZE];

bool cmp(int i1, int i2)
{
    for (int i = 0; i < 26; ++i)
        if (v[in[i1]][i] != v[in[i2]][i])
            return v[in[i1]][i] < v[in[i2]][i];
    return 1;
}
bool equal(int* i1, int* i2)
{
    for (int i = 0; i < 26; ++i)
        if (i1[i] != i2[i])
            return 0;
    return 1;
}

int main()
{
    Read();
    Solve();
    Write();
}

void Read()
{
    fin >> n;

    string aux;
    for (int i = 1; i <= n; ++i)
    {
        fin >> aux;
        for (string::iterator j = aux.begin(); j != aux.end(); ++j)
            ++v[i][*j - 'a'];
        sort(v[i], v[i] + 26);

        in[i] = i;
    }
}

void Solve()
{
    sort(in + 1, in + n + 1, cmp);
    for (int i = 1; i <= n; ++i)
        if ((i == 1 || !equal(v[i - 1], v[i])) && (i == n || !equal(v[i + 1], v[i])))
            ++res;
}

void Write()
{
    fout << res;
}