Cod sursă (job #800043)

Utilizator avatar popescugabriel Popescu Bogdan Gabriel popescugabriel IP ascuns
Problemă Cristela (clasele 9-12) Compilator cpp-32 | 2,77 kb
Rundă Arhiva de probleme Status evaluat
Dată 15 dec. 2024 20:39:51 Scor 0
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <bitset>

using namespace std;

ifstream cin("cristela.in");
ofstream cout("cristela.out");

struct Piu
{
    char s[11];
    int poz;
};

vector<Piu>venergetic(4000);

vector<vector<int>>frati(4000);


///sortez literele in cuvinte
void ordo(int i)
{
    int poz=0;
    char s[11];
    for(char j='a';j<='z';j++)
    {
        if(strchr(venergetic[i].s,j))
            s[poz++]=j;
    }
    s[poz]='\0';
    strcpy(venergetic[i].s,s);
}

///sortez cuvintele in sir dupa prima litera -> apoi tai prima litera
bool cmp(Piu a,Piu b)
{
    if(strcmp(a.s,b.s)<0)
    return 1;
    return 0;
}

int combinaricate2(int n)
{
    return (n*(n-1))/2;
}



bool bfs(int i,int j)
{   
    queue<int>X;
    const int N=4000;
    bitset<N> B=0;
    X.push(i);
    while(X.empty()!=1)
    {
        if(X.front()==j)
        return 1;
        for(auto o : frati[X.front()])
        {
            if(B[o]==0)
            {
                X.push(o);
                B[o]=1;
            }
        }
        X.pop();
    }
    return 0;
}

bool intersectat(int i,int j)
{
    return bfs(i,j);
}

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>venergetic[i].s;
        venergetic[i].poz=i;
        ordo(i);
    }
    int sum=0;
    bool ok=1;
    int cnt=1;
        for(char ch='a';ch<'z';ch++)
        {
        ok=0;
        sort(venergetic.begin(),venergetic.begin()+n,cmp);
        bool gasit=0;
        for(int i=0;i<n;i++)
        {
            
            if(venergetic[i].s[0]!='\0')
                cout<<venergetic[i].s<<" ";
            if(venergetic[i].s[0]!='\0')
            {
                ok=1;
                if(venergetic[i].s[0]==ch)
                {
                    int primu;
                    if(gasit==0)
                    {
                        primu=venergetic[i].poz;
                        cout<<primu<<" ";
                    }
                    gasit=1;
                    if(intersectat(venergetic[i].poz,primu)==0)
                    {
                        //cout<<cnt<<"lol ";
                        cnt++;
                        frati[venergetic[i].poz].push_back(venergetic[0].poz);
                        frati[venergetic[0].poz].push_back(venergetic[i].poz);
                    }
                    strcpy(venergetic[i].s,venergetic[i].s+1);
                }
                else
                {
                    //cout<<cnt<<"lol";
                    sum=sum+combinaricate2(cnt);
                    cnt=1;
                }
                
                
            }
            
        }
        sum=sum+combinaricate2(cnt);
        cnt=1;
        cout<<'\n';
        if(ok==0)
        break;
        }
    cout<<sum;
    return 0;
}