//很容易可以判断当两个字符串相等或者长度相加为奇数时第一个赢
//用map存入每一个字符串标号,对应找出每一个字符串有多少个以及其长度是奇数还是偶数
//则很容易求得答案
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
using namespace std ;
const int maxn = 200010 ;
typedef __int64 ll ;
char str[maxn] ;
int num[maxn] ;
int flag[maxn] ;
map<string , int> ma;
ll gcd(ll a ,ll b)
{
if(b == 0)return a ;
return gcd(b , a%b) ;
}
int main()
{
int T ;
scanf("%d" ,&T) ;
int n ;
while(T--)
{
scanf("%d" ,&n) ;
memset(num , 0 , sizeof(num)) ;
memset(flag , 0 ,sizeof(flag)) ;
ma.clear() ;
int j = 1;
for(int i = 1;i <= n;i++)
{
scanf("%s" ,str) ;
int len = strlen(str) ;
int t = ma[str] ;
if(t) num[t]++ ;
else
{
flag[j] = len&1;
num[j] = 1;
ma[str] = j++;
}
}
ll ans = 0;
int sum_f[2] = {0 , 0} ;
for(int i = 1;i < j;i++)
{
ans += (ll)sum_f[!flag[i]] * (ll)num[i] ;
sum_f[flag[i]] += num[i];
if(num[i] >= 2)
ans += (ll)(num[i])*(ll)(num[i]-1)/2 ;
}
ll sum = n*(n-1)/2 ;
if(ans == 0)
puts("0/1") ;
else if(ans == sum)
puts("1/1") ;
else
{
ll temp = gcd(ans , sum) ;
printf("%I64d/%I64d\n" , ans/temp , sum/temp) ;
}
}
return 0;
}
hdu5229 ZCC loves strings 博弈
原文:http://blog.csdn.net/cq_pf/article/details/45788361