【题目描述】

其实在开考前半个小时题面并不是这样的。

由于明天要考试,同学们要把抽屉里的书都搬空,书很多而且办了走读不能回寝室的学长一眼就看到了回班撩他的学姐,于是就把学姐当学长用♂了:“帮我把这摞书搬走OvO”。

学姐筋疲力尽地抱着沉重的一摞书回到了机房,出于无聊她翻开了学长的字典。

学长的字典由一个字符串组成。对于两个字符串a和b,如果a既是b的前缀也是b的后缀,那么称a和b“相似”,空字符串和任何字符串相似。一个字符串可以通过编辑变换成一个比它短而且与它相似的字符串,付出的代价为这两个字符串的长度之差的平方。两个字符串通过编辑而变为同一个字符串所花费的最小代价被称为最短编辑距离。

给定学长的字典,现在学姐想知道这个字符串的每一对前缀的最短编辑距离中的最大值是多少。请你帮助劳累的紫萱学姐解决这个问题。

【输入格式】

一个字符串,仅包含小写英文字母。

【输出格式】

这个字符串每一对前缀中最长的最短编辑距离。

【样例输入】

abcab

【样例输出】

23

【提示】

最短编辑距离最长的一对前缀是abca和abcab,最短变换过程如下(箭头中的数字为过程的代价)

“abca”-9->“a”-1->(空字符串)

“abcab”-9->“ab”-4->“”

对于40%的数据,n≤500。

对于70%的数据,n≤5000。

对于100%的数据,n≤1000000,n为字符串长度。

题解:

  不得不承认,这是一道非常好的题目,首先,我们可以考虑用哈希预处理出所以可能的转移,但这个题目可以贪心的思考,对于每个可能的相似前缀,只要考虑向最大的相似前缀转移就可以了。理由如下:

  1.对于一个前缀转移到一个更小的相似前缀,肯定是每次转移长度之差越小越好,因为a^2+b^2<x^2(x=a+b),所以我们每次转移的最大可转移的相似前缀上一定花费最小。

  2.对于前缀x的多种转移中次大的转移一定可以由最大的转移 转移过来,如一个len=7的前缀,可以转移到长度为5,长度为3,长度为0,这三种前缀上,那么5必定可以转移到3,3必定可以转移到0.

  所以我们只要对考虑最大的前缀就可以了(用类似于next数组的求发求)。

  如果我们把每个前缀看成一个节点(编号为前缀长度),然后向可转移的节点连边,边权为长度差,那么显然答案就变成了求任意两点到另一点的最短路之和,不难发现,连出来的边是一棵树,因为每个节点只会向前面的节点连边,并且对于每条链都会最后连到0节点。然后我们发现不用枚举所有的前缀作为两个前缀变成的相似前缀,因为就是我们所选两个节点的lca,这个十分显然因为边权是>0的,那么我们把边变成双向,就转化成了树上求直径问题了。

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define MAXN 1000100
#define ll long long
using namespace std;
struct edge{int first;int next;int to;ll quan;
}a[MAXN*3];
int f[MAXN],roof=0,n;
ll dis[MAXN],dis2[MAXN],num=0;
char s[MAXN];void pre(){f[1]=0;for(int i=2;i<=n;i++){int j=f[i-1];while(j&&s[i]!=s[j+1]) j=f[j];if(s[i]==s[j+1]) f[i]=j+1;else f[i]=j;}
}void addedge(int from,int to,ll quan){a[++num].to=to;a[num].quan=quan;a[num].next=a[from].first;a[from].first=num;
}void dfs(int now,int fa,ll *dis){for(int i=a[now].first;i;i=a[i].next){ll to=a[i].to,quan=a[i].quan;if(to==fa) continue;dis[to]=dis[now]+quan;dfs(to,now,dis);}
}int main()
{scanf("%s",s+1);n=strlen(s+1);pre();for(int i=1;i<=n;i++){addedge(i,f[i],(long long)(i-f[i])*(i-f[i]));addedge(f[i],i,(long long)(i-f[i])*(i-f[i]));}dfs(0,0,dis);for(int i=1;i<=n;i++) if(dis[roof]<dis[i]) roof=i;memset(dis,0,sizeof(dis));dfs(roof,roof,dis2);for(int i=1;i<=n;i++) if(dis2[roof]<dis2[i]) roof=i;printf("%lld",dis2[roof]);return 0;
}

转载于:https://www.cnblogs.com/renjianshige/p/7429944.html

COGS 2510. 拯救紫萱学姐相关推荐

  1. 到底TM的怎么谈恋爱【学姐来教你】

    到底他妈的应该怎么把妹[初级教程] 其实我也不想写这么无聊的东西可是学弟一遍一遍问啊,学姐大三了啊很忙啊不能天天看着你给你分析感情问题啊,学姐觉得应该授之以渔不能授之以鱼啊,于是学姐版把妹课堂开课啦! ...

  2. 老学姐2021年数字IC秋招复盘

    本着学习交流的目的,写了下面的内容,希望大家都能拿到心仪的offer. 1. 秋招变春招? 从我个人经历来说是这样的,因为今年很多企业六七月份就开始提前批了,而我六七月还在做项目,等我开始的时候,发现 ...

  3. 首师大计算机邵老师,信息科学学院 学生活动 【毕业季】看我徒手攀登——2013级计算机科学与技术专业邵玉杰学姐专访...

    邵玉杰 14-16年连续三年获院级三好学生称号 两次获得获得国家励志奖学金 2015年获大学生科研创新项目北京市优秀奖 参与北京数学建模大赛.美国数学建模大赛 参与同城约周末app研发.闻啼鸟学霸讲师 ...

  4. 学姐分享:在求职路上少走一些弯路

    Datawhale干货 作者:悯缘,阿里巴巴,TEDx分享嘉宾 写简历为什么那么重要 我毕业后就创业了,没有参加过校招,所以一直没有正儿八经写过简历.后来打算正式进入职场工作,跟猎头电话之后写了第一份 ...

  5. 邀请了阿里的学长学姐分享

    Datawhale学习 组织方:阿里云开发者社区.阿里校园招聘.Datawhale 活动初衷 阿里巴巴倡导"人人公益3小时",以此来激发大家内心的善念,并通过个人的专业度,来释放善 ...

  6. 清华学姐的研究生复试经验!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale线上 分享:陈琰钰,清华大学,Datawhale成员 「WhaleShare」 ...

  7. 厦大的计算机博士好考吗,2018双非学姐的厦大考博逆袭之路——本硕求学生涯历程...

    原标题:2018双非学姐的厦大考博逆袭之路--本硕求学生涯历程 2018双非学姐的厦大考博逆袭之路--本硕求学生涯历程 作者:枰超 编辑:学长 2018年的春节已接近尾声,也距离我结束2018年博士申 ...

  8. CDOJ1324-卿学姐与公主 【线段树点更新】

    http://acm.uestc.edu.cn/#/problem/show/1324 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory ...

  9. 学生用的笔记本电脑什么样的好_大学生用的学生党笔记本什么牌子好,听听学姐的...

    刚进入大学的萌新在选择笔记本电脑产品的时候可能会没有头绪,笔记本什么牌子好,什么样的笔记本电脑才是适合自己使用的呢?让师姐带着你,从一般需求.专业需求.娱乐需求等角度为你挑选一台合适的新机指条明路. ...

  10. 5分绩点转4分_作为一名大学生,如何规划4年大学生活?学姐:建议从这5点做起...

    导语:作为一名大学生,如何规划4年大学生活?学姐:建议从这5点做起 进入大学后,同学们会拥有更多可自由支配的时间.大学课余时间多,家长不在身边,老师又不管.同学们可以说是彻底自由了.但是世界上没有绝对 ...

最新文章

  1. OPPO和微软合作,开放“召唤小冰”
  2. 用boolalpha输出true或false的问题
  3. 关于Android 传感器坐标与读数的进一步讨论
  4. MATLAB GUI引用了不存在的字段
  5. Oracle数据库备份与还原命令 -- exp/imp
  6. android content provider线程安全,Android ContentProvider的线程安全(二)
  7. android 系统框架 dx
  8. layui修改table中的按钮_如何发挥作用layui页面按钮给table移除一行(手动去除)...
  9. ios3怎么取消长按弹出菜单_针对数码打印机中叠印怎么处理
  10. ubuntu配置vsftpd记录
  11. Mac安装Mysql(图文解说详细版)
  12. Python——对象
  13. LabVIEW中二维码生成和识别
  14. 协议--SIP/SDP
  15. 抖音通过什么方式变现,抖音变现方式分别有什么
  16. 判断和推论_数据科学的假设和推论
  17. “我的代码正在被千百万人使用”,MySQL 之父等六大国际数据库掌门人谈如何做数据库!...
  18. 深入理解Oracle中的case when then else end
  19. 计算机专业英语祈使句,什么是祈使句_英语祈使句的用法_祈使句的结构 - 沪江...
  20. 为什么我们不再 Root 和刷机了?

热门文章

  1. 如何确定高斯滤波的标准差和窗口大小
  2. mysql查询一门课程的学生的信息_MySQL数据库查询练习题
  3. UNITY 2D入门基础教程 (二)
  4. DBC编辑_文本形式编辑
  5. 【从零开始学习深度学习】13. 防止过拟合方法:权重衰减(L2惩罚项)介绍及示例演示
  6. 显卡老将Quadro退圈,英伟达借数据中心争“芯片一哥”?
  7. 《工程伦理》期末考试答案
  8. Android Studio微信app项目
  9. FTP和SFT区别记录笔记
  10. CityEngine学习资料