FJNU Fang G and his Friends(状压DP)题解
Description
Fang G
发现,每个队伍能发挥出的能力值和这个队伍之间满意值是相等的,而一个队伍之间满意值定义为每一个人对于这个队伍所有人(注意是所有人哦!!!)满意度总和的总和,而一个人对另外一个人的满意度和他们的名字是有关的,A对B的满意度定义为A名字前缀和B名字后缀的最长公共前缀(其实就是首x尾o相x连o辣)。
而Fang G要做的就是如何分为两队,使得ooxx更加精彩!但是Fang G 现在有事情要做(是什么事情呢?),没办法完成分配工作,你现在就要帮他完成这个伟大的使命!使得两队在能力值差值最小的情况下,能力值较低的那一队满意度尽量高。
Input
接下来每组测试数据里:
第一行输入一个n代表待分队的人数(1<=n<=20)
接下来有n行,每行有一个字符串si代表每个人的姓名0<|si|<=10000
Output
Sample Input
1
3
aab
bbc
cca
Sample Output
3 7
思路:KMP能求出互相之间的满意度。然后我们要遍历所有可能。遍历的复杂度O(2 ^ n),但是如果我们用n * n的复杂度去判断每一种情况每队的满意度会超时。我们可以用状压DP。显然一共1 << n种可能。我们从0开始往1 << n - 1判,最低位出现的1一定是新变化的,那么我就可以直接算出原来的情况+新增一个最低位的1,达到O(n)算出每队的满意度。
代码:
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = + ;
const ull seed = ;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + ;
char s[][maxn];
int w[][];
int Next[maxn], len[maxn];
int dp[ << ];
int n;
void preKMP(int pos){
int i = , j = -;
Next[] = -;
while(i < len[pos]){
while(j != - && s[pos][i] != s[pos][j]) j = Next[j];
++i;++j;
Next[i] = j;
}
}
int KMP(int p, int str){
int i = , j = ;
while(i < len[str]){
while(j != - && s[p][j] != s[str][i]) j = Next[j];
++j;
++i;
if(i == len[str]) return j;
if(j >= len[p]){
j = Next[j];
}
}
return ;
}
int dis, ans1, ans2;
int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d" ,&n);
for(int i = ; i < n; i++){
scanf("%s", s[i]);
len[i] = strlen(s[i]);
}
for(int i = ; i < n; i++){
preKMP(i);
for(int j = ; j < n; j++){
if(j == i){
w[i][j] = len[i];
continue;
}
w[i][j] = KMP(i, j);
}
} memset(dp, , sizeof(dp));
int mx = ( << n) - ;
for(int i = ; i <= mx; i++){
for(int j = ; j < n; j++){
if(i & ( << j)){
for(int k = j + ; k < n; k++){
if(i & ( << k)){
dp[i] += w[j][k] + w[k][j];
}
}
dp[i] += dp[i - ( << j)] + w[j][j];
break;
}
}
}
dis = INF;
ans1 = -INF, ans2 = -INF;
for(int i = ; i <= mx; i++){
if(abs(dp[i] - dp[mx ^ i]) < dis){
dis = abs(dp[i] - dp[mx ^ i]);
ans1 = min(dp[i], dp[mx ^ i]);
ans2 = max(dp[i], dp[mx ^ i]);
}
else if(abs(dp[i] - dp[mx ^ i]) == dis){
int r1 = min(dp[i], dp[mx ^ i]);
int r2 = max(dp[i], dp[mx ^ i]);
if(r1 > ans1){
ans1 = r2, ans2 = r2;
}
}
}
printf("%d %d\n", ans1, ans2);
}
return ;
}
FJNU Fang G and his Friends(状压DP)题解的更多相关文章
- Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP
Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...
- POJ 3254 - Corn Fields - [状压DP水题]
题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- ZOJ3802 Easy 2048 Again (状压DP)
ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...
- CF453B Little Pony and Harmony Chest (状压DP)
CF453B CF454D Codeforces Round #259 (Div. 2) D Codeforces Round #259 (Div. 1) B D. Little Pony and H ...
- fzu2188 状压dp
G - Simple String Problem Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- loj 1316(spfa预处理+状压dp)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024 题意:求0-(n-1)的经过最多的标记的点的最短路. 思路 ...
- HDU5816 Hearthstone(状压DP)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5816 Description Hearthstone is an online collec ...
- HDU 4568 Hunter 最短路+状压DP
题意:给一个n*m的格子,格子中有一些数,如果是正整数则为到此格子的花费,如果为-1表示此格子不可到,现在给k个宝藏的地点(k<=13),求一个人从边界外一点进入整个棋盘,然后拿走所有能拿走的宝 ...
随机推荐
- springcloud第四步:ribbon搭建服务负载均衡
使用ribbon实现负载均衡 启动两个会员服务工程,端口号分别为8762.8763,订单服务 使用负载均衡策略轮训到会员服务接口. 什么是ribbon ribbon是一个负载均衡客户端 类似nginx ...
- JVM入门到放弃之基本概念
1. 基本概念 jvm 是可运行Java代码的假想计算机,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. jvm 是运行在操作系统之上的,屏蔽了与具体操作系统平台相关的信息 ...
- git使用:本地分支merge到远程分支
背景:为了更加规范维护自动化测试工程,代码提交流程最近更新了,先拉分支到本地修改,完成后同步到远程分支. 前置条件 (1)本地机器可通过ssh与gitlab服务器通信 (2)gitlab上的测试项目中 ...
- [js]javascript索引
js&jq总结的还是挺棒的: http://www.cnblogs.com/yuanchenqi/articles/5980312.html http://www.cnblogs.com/yu ...
- mac电脑安装wxPython2.8.12.1不成功怎么办 , Could not find a version that satisfies the requirement 2.8.12.1
目的:robotframe-ride用于接口测试 遇到的问题: 1.mac终端pip安装robotframework-ride后 pip install robotframework-ride (pi ...
- 使用AD画PCB的技能总结(纯属个人笔记,请大神多多指导)
在参加2017全国电子设计大赛的过程中,我将平时学到的点点滴滴记录下来,作为曾经的回忆吧!(未完待续) ------------------------------------------------ ...
- Java bean 转 Map
Java bean 转 Map 时需要使用Fastjson //方法 一 Map<String, Object> a = (Map<String, Object>)JSON.t ...
- kali,parrot最新更新debain源
deb http://mirrors.163.com/debian/ jessie main non-free contribdeb http://mirrors.163.com/debian/ je ...
- windows----------Windows10 远程桌面连接失败,报CredSSP加密oracle修正错误解决办法
1.通过运行gpedit.msc进入组策略配置(需要win10专业版,家庭版无解),策略路径:“计算机配置”->“管理模板”->“系统”->“凭据分配”,设置名称: 加密 Oracl ...
- IP地址数据库 | 手机号段归属地数据库 | 行政区划省市区数据库
2019年4月最新版 IP地址数据库 (全球版·国内版·国外版·掩码版·英文版) 全球旗舰版 454267行 国内精华版 244379行 演示 https://www.qqzeng.com/ip ...