HDU 5229 ZCC loves strings 博弈
2024-09-13 04:54:22
题目链接:
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,线性扫一遍就好了。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std; const int maxn=1e5+; int odd[];
char str[maxn];
int n;
map<string,int> mymap; void init(){
mymap.clear();
memset(odd,,sizeof(odd));
} int gcd(int a,int b){ return b==?a:gcd(b,a%b); } int main(){
int tc;
scanf("%d",&tc);
while(tc--){
init();
int ans=;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%s",str);
int o=strlen(str)&;
ans+=odd[!o];
odd[o]++; //str不需要是string类型!
ans+=mymap[str];
mymap[str]++;
}
int demo=n*(n-)/;
int g=gcd(ans,demo);
if(ans==) printf("0/1\n");
else printf("%d/%d\n",ans/g,demo/g);
}
return ;
} /*
2
ab
bc
*/
最新文章
- winform程序一启动抛出异常--调用目标发生异常
- [Nhibernate]体系结构
- 使用vs中的发布功能发布asp.net core项目时遇到ERROR_CERTIFICATE_VALIDATION_FAILED错误
- [游戏模版13] Win32 透明贴图 主角移动
- JAVA通过poi对Excel数据在(jsp+ssh)环境下导入导出
- JavaScript escape encodeURI encodeURIComponent() 函数
- Java语言实现简单FTP软件------>;FTP软件本地窗口的实现(五)
- 如何关闭Altium Designer联网功能(图文教程)
- 【转】HLSL基础
- QT5:C++实现基于multimedia的音乐播放器(二)
- GIt -- git push 远程分支老是需要重新输入公钥密码问题处理?
- C++中 引用&;与取地址&;的区别
- python数据分析实例(1)
- URAL 1099 Work Scheduling (一般图最大匹配) 模板题【带花树】
- Session详解、ASP.NET核心知识(8)
- PixelMatorPro快捷键大全(osx)
- 0-如何正确使用 Django的User Model
- DVWA安装
- UVALive-5135 Mining Your Own Business (无向图的双连通分量)
- xunsearch安装及环境检测(一)