C - Card Game

Crawling in process...Crawling failedTime Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu

Description

 

 

Jimmy invents an interesting card game. There are N cards, each of which contains a string Si. Jimmy wants to stick them into several circles, and each card belongs to one circle exactly. When sticking two cards, Jimmy will get a score. The score of sticking two cards is the longest common prefix of the second card and the reverse of the first card. For example, if Jimmy sticks the card S1 containing ``abcd" in front of the card S2 containing ``dcab", the score is 2. And if Jimmy sticks S2 in front of S1, the score is 0. The card can also stick to itself to form a self-circle, whose score is 0.

For example, there are 3 cards, whose strings are S1=``ab", S2=``bcc", S3=``ccb". There are 6 possible sticking:

  1. S1S2,     S2S3,     S3S1, the score is 1+3+0 = 4
  2. S1S2,     S2S1,     S3S3, the score is 1+0+0 = 1
  3. S1S3,     S3S1,     S2S2, the score is 0+0+0 = 0
  4. S1S3,     S3S2,     S2S1, the score is 0+3+0 = 3
  5. S1S1,     S2S2,     S3S3, the score is 0+0+0 = 0
  6. S1S1,     S2S3,     S3S2, the score is 0+3+3 = 6

So the best score is 6.

Given the information of all the cards, please help Jimmy find the best possible score.

Input

There are several test cases. The first line of each test case contains an integer N(1N200). Each of the next N lines contains a string Si. You can assume the strings contain alphabets ('a'-'z', 'A'-'Z') only, and the length of every string is no more than 1000.

Output

Output one line for each test case, indicating the corresponding answer.

Sample Input

3
ab
bcc
ccb
1
abcd

Sample Output

6
0
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
char str[][];
int lx[],ly[];
int sx[],sy[];
const int inf=;
int w[][];
int LINK[];
int ans;
int n; int dmin;
bool Find(int u)
{
sx[u] =;
for(int v = ;v <= n;v ++)
{
if(!sy[v])
{
int t = lx[u] + ly[v] - w[u][v];
if(t)
{
if(dmin > t)
dmin = t;
}
else
{
sy[v] = true;
if(LINK[v] == - || Find(LINK[v]))
{
LINK[v] = u;
return true;
}
}
}
}
return false;
} int KM(){
for(int i = ;i <= n;i ++)
{
for(int j = ;j <= n;j ++)
if(lx[i] < w[i][j])
lx[i] = w[i][j];
} memset(LINK,-,sizeof(LINK)); for(int i = ;i <= n;i ++)
{
while(true)
{ memset(sx,,sizeof(sx));
memset(sy,,sizeof(sy));
dmin = inf;
if(Find(i))
break;
for(int j = ;j <= n;j ++)
{
if(sx[j])
lx[j] -= dmin;
if(sy[j])
ly[j] += dmin;
}
}
}
for(int i = ;i <= n;i ++)
ans += w[LINK[i]][i];
return ans;
} int main(){ while(scanf("%d",&n)!=EOF){
getchar();
memset(str,,sizeof(str));
memset(lx,,sizeof(lx));
memset(ly,,sizeof(ly));
memset(w,,sizeof(w));
for(int i=;i<=n;i++){
scanf("%s",str[i]);
getchar();
} for(int i=;i<=n;i++){
for(int j=;j<=n;j++){ int num=;
if(i==j){
w[i][j]=;
continue;
}
int len1=strlen(str[i]);
int len2=strlen(str[j]);
int temp1=len1-,temp2=;
while(temp1>=&&temp2<=len2-&&str[i][temp1]==str[j][temp2]){ num++;
temp1--;
temp2++; }
w[i][j]=num; }
}
ans=;
ans=KM();
printf("%d\n",ans);
}
return ;
}

UVALive 5027 二分图 EK的更多相关文章

  1. Tracer Deployment UVALive - 8271 二分图匹配

    复习二分图又想起了这道题,裸的二分图匹配,直接匈牙利算法就可以了,mark一下这个比较好用的稠密图匈牙利算法模板 题目:题目链接 AC代码: #include <iostream> #in ...

  2. 二分图的最大匹配——最大流EK算法

    序: 既然是个图,并且求边数的最大值.那么这就可以转化为网络流的求最大流问题. 只需要将源点与其中一子集的所有节点相连,汇点与另一子集的所有节点相连,将所有弧的流量限制置为1,那么最大流 == 最大匹 ...

  3. 网络(最大)流初步+二分图初步 (浅谈EK,Dinic, Hungarian method:]

    本文中  N为点数,M为边数: EK: (brute_force) : 每次bfs暴力找到一条增广路,更新流量,代码如下 : 时间复杂度:O(NM²): #include<bits/stdc++ ...

  4. 训练指南 UVALive - 4043(二分图匹配 + KM算法)

    layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...

  5. 训练指南 UVALive - 3523 (双联通分量 + 二分图染色)

    layout: post title: 训练指南 UVALive - 3523 (双联通分量 + 二分图染色) author: "luowentaoaa" catalog: tru ...

  6. UVALive 5033 I'm Telling the Truth 二分图最大匹配(略有修改)

    I - I'm Telling the Truth Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu ...

  7. UVALive 5903 Piece it together(二分图匹配)

    给你一个n*m的矩阵,每个点为'B'或'W'或'.'.然后你有一种碎片.碎片可以旋转,问可否用这种碎片精确覆盖矩阵.N,M<=500 WB  <==碎片 W 题目一看,感觉是精确覆盖(最近 ...

  8. UVALive 3415 Guardian of Decency(二分图的最大独立集)

    题意:老师在选择一些学生做活动时,为避免学生发生暧昧关系,就提出了四个要求.在他眼中,只要任意两个人符合这四个要求之一,就不可能发生暧昧.现在给出n个学生关于这四个要求的信息,求老师可以挑选出的最大学 ...

  9. UVALive 4043 Ants(二分图完美匹配)

    题意:每个蚁群有自己的食物源(苹果树),已知蚂蚁靠气味辨别行进方向,所以蚁群之间的行动轨迹不能重叠.现在给出坐标系中n个蚁群和n棵果树的坐标,两两配对,实现以上要求.输出的第 i 行表示第 i 个蚁群 ...

随机推荐

  1. 改Chrome的User Agent,移动版网络

    理论上访问手机版或者iPad等平板电脑版的网络,应该可以剩些流量的,毕竟移动网络是经过优化压缩的,但是PC电脑如果访问移动版的网站呢?我主要使用的浏览器是Chrome,这几天也找了下Chrome下的修 ...

  2. 阿里数据库连接池druid

    官方wiki: https://github.com/alibaba/druid/wiki 实用方法介绍的想当详细,包含监控.扩展.大力推荐!

  3. Java面试不得不知的程序(二)

    [程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 斐波那契数列:前面相邻两项之和,构 ...

  4. 谷歌angle库使用心得

    通过谷歌的angle库可以在项目中,调用opengl接口渲染时,选择调用directx或者webgl来渲染,避免机器没有安装opengl驱动启动异常的问题. 这个库的使用可以不修改原有使用opengl ...

  5. mysql 数据库设计规范

    MySQL数据库设计规范 目录 1. 规范背景与目的 2. 设计规范 2.1 数据库设计 2.1.1 库名 2.1.2 表结构 2.1.3 列数据类型优化 2.1.4 索引设计 2.1.5 分库分表. ...

  6. python核心编程2 第五章 练习

    5-2 运算符(a) 写一个函数,计算并返回两个数的乘积(b) 写一段代码调用这个函数,并显示它的结果 def product(x, y): return x * y if __name__ == ' ...

  7. Java OOP——第七章 多线程

    1.进程:是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间): Eg:用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间.当用户再次点击左面的IE浏览器, ...

  8. php-5.6.26源代码 - opcode处理器,“函数调用opcode”处理器,如何调用扩展模块的函数

    // opcode处理器 --- ZEND_DO_FCALL_SPEC_CONST_HANDLER实现在 php-5.6.26\Zend\zend_vm_execute.h static int ZE ...

  9. python系列4之装饰器

    目录 递归算法解析 冒泡排序解析 装饰器解析 一. 递归 1. 递归的定义 递归(Recursion),又成为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.递归一词还较长用于描述以 ...

  10. auto用法

    在C++11中,如果编译器在定义一个变量的时候可以推断出变量的类型,不用写变量的类型,你只需写auto即可. 第一种用法:自动推到内置类型 int x = 100; //C++ 11 auto x = ...