Pagini recente »
Cod sursă (job #800043)
Cod sursă (job
#800043)
#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;
}