HDU 5229 ZCC loves strings 博弈

题目链接:

hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5229

bc:http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=582&pid=1002

题解:

设字符串a,b;

结论:先手胜的充分必要条件是|a|+|b|为奇数或a==b。

证明:

数学归纳法:

|a|+|b|=0;时,先手败,结论成立

假设|a|+|b|<p时结论成立,现在分类讨论|a|+|b|的情况:

p为偶数:

如果a=b,则先手直接采取方案b取胜,否则,先手只能执行方案A必败。

p为奇数:

先手只要用方案a取走一个,且保证取走之后a!=b(取较短的那个,当较短为0时,去另一个),那么就能保证必胜。

综上所述,结论成立。

---------------------------------我是分割线----------------------------------

对于当前输入串,统计它之前与它相等的串的个数x和长度与它不同奇偶的串的个数y,累加它对答案的贡献x+y,线性扫一遍就好了。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<map>
 5 using namespace std;
 6 
 7 const int maxn=1e5+10;
 8 
 9 int odd[2];
10 char str[maxn];
11 int n;
12 map<string,int> mymap;
13 
14 void init(){
15     mymap.clear();
16     memset(odd,0,sizeof(odd));
17 }
18 
19 int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }
20 
21 int main(){
22     int tc;
23     scanf("%d",&tc);
24     while(tc--){
25         init();
26         int ans=0;
27         scanf("%d",&n);
28         for(int i=0;i<n;i++){
29             scanf("%s",str);
30             int o=strlen(str)&1;
31             ans+=odd[!o];
32             odd[o]++; 
33             
34             //str不需要是string类型! 
35             ans+=mymap[str];
36             mymap[str]++;
37         }
38         int demo=n*(n-1)/2;
39         int g=gcd(ans,demo);
40         if(ans==0) printf("0/1\n");
41         else printf("%d/%d\n",ans/g,demo/g);
42     }
43     return 0;
44 }
45 
46 /*
47 2
48 ab
49 bc
50 */

 

转载于:https://www.cnblogs.com/fenice/p/5388138.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值