博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CF566A]Matching Names
阅读量:6974 次
发布时间:2019-06-27

本文共 1413 字,大约阅读时间需要 4 分钟。

[CF566A]Matching Names

题目大意:

A组和B组各\(n(n\le10^5)\)个字符串\((\sum|S|\le8\times10^5)\),将它们两两匹配,使得每组两个字符串的LCP之和最大,输出最大值,并输出方案。

思路:

Trie上贪心,在深的结点能匹配则匹配。

源代码:

#include
#include
#include
const int N=1e5+1,L=8e5+1;int n,ans;char s[L];std::vector
> v;class Trie { private: std::set
set[L][2]; int ch[L][26],par[L],sz; int idx(const char &c) const { return c-'a'; } void erase(int p,const int &x,const bool &t) { while(p) { set[p][t].erase(x); p=par[p]; } set[0][t].erase(x); } public: void insert(char s[],const int &id,const bool &t) { set[0][t].insert(id); for(register int i=0,p=0;s[i];i++) { const int c=idx(s[i]); if(!ch[p][c]) { ch[p][c]=++sz; par[ch[p][c]]=p; } p=ch[p][c]; set[p][t].insert(id); } } void solve(const int &p,const int &dep) { for(register int i=0;i<26;i++) { if(ch[p][i]) { solve(ch[p][i],dep+1); } } while(!set[p][0].empty()&&!set[p][1].empty()) { ans+=dep; const int x=*set[p][0].begin(); const int y=*set[p][1].begin(); v.push_back(std::make_pair(x,y)); erase(p,x,0); erase(p,y,1); } }};Trie t;int main() { scanf("%d",&n); for(register int i=1;i<=n;i++) { scanf("%s",s); t.insert(s,i,0); } for(register int i=1;i<=n;i++) { scanf("%s",s); t.insert(s,i,1); } t.solve(0,0); printf("%d\n",ans); for(register unsigned i=0;i

转载于:https://www.cnblogs.com/skylee03/p/10217946.html

你可能感兴趣的文章
阿里云 Aliplayer高级功能介绍(二):缩略图
查看>>
从1.5K到18K 一个程序员的5年成长之路(二)
查看>>
从HelloWorld看Knative Serving代码实现
查看>>
制作一个简单的linux
查看>>
【ZooKeeper Notes 14】数据模型
查看>>
Expect自动化控制简单介绍
查看>>
我的友情链接
查看>>
Vmware虚拟机的复制后无法使用的问题和解决
查看>>
好程序员web前端技术分享媒体查询
查看>>
开博前的话
查看>>
【老孙随笔】注意啦,精神集中点儿!
查看>>
nagios监控shadow文件
查看>>
用Kotlin在IntelliJ Idea中无法生成 spring-configuration-metadata.json 文件
查看>>
企业数据库合规的最佳实践
查看>>
tar自动打包指定文件夹中的文件到指定目录
查看>>
修改Vim配色方案
查看>>
awk (一)
查看>>
C语言:在屏幕上输出信息
查看>>
C语言存储类关键字
查看>>
万能删除代码
查看>>