CF 566A Matching Names
2024-09-02 21:21:43
CF 566A Matching Names
题目描述
给出n个名字和n个昵称,求一个名字和昵称的劈配方案,使得被劈配的名字和昵称的最长公共前缀长度的和最大。
1<=n<=100000
字符总数最多800000
输入格式
第一行n
后面n行名字
最后n行昵称
输出格式
第一行最大最长公共前缀长度和
后面n行每行两个整数分别为名字和昵称的编号代表劈配方案,有SPJ
这题好神仙。
本来一看匹配,费用流费用流,一看数据,萎了
考虑是匹配字符串,遂用一些字符串的算法。
要求总匹配长度最大,由贪心我们先令单次匹配较大的匹配,容易证得这样不会更差。
把字符串放到字典树上,根据种类进行编号。
然后在dfs时维护一个系统队列,每次把一个点为根的子树下面的点给统计好,再做上面的。
Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N=800010;
struct node
{
int ch[26];
vector <pair <int,int > > per;
}t[N];
char c[N];
int tot,n;
void add(int typ,int num)
{
int len=strlen(c);
int now=0;
for(int i=0;i<len;i++)
{
if(!t[now].ch[c[i]-'a']) t[now].ch[c[i]-'a']=++tot;
now=t[now].ch[c[i]-'a'];
}
t[now].per.push_back(make_pair(num,typ));
}
int q[2][N],l[2],r[2],ans[2][N],cnt,sum;
void dfs(int now,int dep)
{
int tl[2];
tl[0]=l[0],tl[1]=l[1];
l[0]=r[0]+1;
l[1]=r[1]+1;
for(int i=0;i<26;i++)
if(t[now].ch[i])
dfs(t[now].ch[i],dep+1);
for(int i=0;i<t[now].per.size();i++)
{
int typ=t[now].per[i].second;
q[typ][++r[typ]]=t[now].per[i].first;
}
while(l[0]<=r[0]&&l[1]<=r[1])
{
ans[0][++cnt]=q[0][r[0]--];
ans[1][cnt]=q[1][r[1]--];
sum+=dep;
}
l[0]=tl[0];
l[1]=tl[1];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",c);
add(0,i);
}
for(int i=1;i<=n;i++)
{
scanf("%s",c);
add(1,i);
}
dfs(0,0);
printf("%d\n",sum);
for(int i=1;i<=n;i++)
printf("%d %d\n",ans[0][i],ans[1][i]);
return 0;
}
2018.7.25
最新文章
- MySQL导出数据
- python学习之 字符串前&#39;r&#39;的用法
- CPlus的简单线程的制作
- Ubuntu anzhuang
- Scala初探:新潮的函数式面向对象语言
- gauss消元
- python数字图像处理(13):基本形态学滤波
- 学习cocos-js的准备工作
- codeforces343A A. Rational Resistance
- 通用php与mysql数据库配置文件
- ExpandableListView(可展开的列表组件)的说明以及其用法
- [Angular 2] Injecting a Service
- Python科学计算—numpy模块总结(1)
- MySQL索引及查询优化总结 专题
- java.lang.ClassNotFoundException: com.sun.xml.ws.spi.ProviderImpl解决办法
- centos 安装 和 linux 简单命令
- win7颜色反转
- Mybatis学习4——一对一关联查询方法2------实体作为属性
- php 5.3.10 cli 模式加载php_openssl.dll
- hudson.AbortException: No files found in path D:\testproject\project2\testoutput\ with configured filemask: output.xml
热门文章
- 「日常训练」 Fire!(UVA-11624)
- 初探C#
- vue异步分页+初始化页面
- django中model字段与属性
- MySql面试题(持续更新)
- Matplotlib用法
- 04慕课网《vue.js2.5入门》——Vue-cli开发todolist
- hdu1242 Rescue DFS(路径探索题)
- VK Cup 2015 - Round 2 (unofficial online mirror, Div. 1 only) B. Work Group 树形dp
- C语言文法阅读与理解