MCHAOS - Chaos Strings
Tác giả: hieult
Ngôn ngữ: C++
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cassert>
#include<ctime>
#include<algorithm>
#include<iterator>
#include<iostream>
#include<cctype>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<list>
//#include<conio.h>
#define ep 0.000000001
#define maxn 100011
#define oo 1111111111
#define base 100000000
#define TR(c, it) for(typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++)
double const PI=4*atan(1);
using namespace std;
typedef pair<int, int> II;
typedef vector<int> VI;
typedef vector<II> VII;
typedef vector<VI> VVI;
typedef vector<VII> VVII;
int n,dem[maxn+10];
long long KQ=0;
char S[11];
struct chuoi{
int id;
char s[11];
chuoi(){};
bool operator <(chuoi T) const{
return(strcmp(s,T.s)<0);
}
};
chuoi A[maxn];
void reverse(char p[])
{
int len=strlen(p);
char t;
for(int i=(--len), j=0; i>len/2; i--, j++)
{
// exchange elements
t=p[i];
p[i]=p[j];
p[j]=t;
}
}
void update(int u){
while(u<=100000){
dem[u]++;
u+=u&-u;
}
}
long long tinh(int u){
long long r = 0;
while(u>0){
//printf("%d\n",u);
r+=dem[u];
u-=u&-u;
}
return r;
}
int main()
{
// freopen("MCHAOS.in","r",stdin);
memset(dem,0,sizeof(dem));
scanf("%d",&n);
for(int i = 0;i<n;i++){
scanf("%s",A[i].s);
// printf("%s\n",A[i].s);
}
sort(A,A+n);
for(int i = 0;i<n;i++){
A[i].id = n-i;
reverse(A[i].s);
// printf("%s\n",A[i].s);
}
sort(A,A+n);
for(int i = 0;i<n;i++){
// printf("%d\n",A[i].id);
KQ += tinh(A[i].id-1);
update(A[i].id);
}
printf("%lld\n",KQ);
// getch();
}