hdu5229 ZCC loves strings 博弈

//很容易可以判断当两个字符串相等或者长度相加为奇数时第一个赢
//用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 博弈)