巧克力

题目描述

小\(T\)有\(N\)块巧克力, 每块巧克力上都有一句话(由小写英文字母组成,不含标点) 。现在每块巧克力都断成了若干截,更糟糕的是,有一些碎片丢失了 ,但是剩下的碎片之间的顺序是可以辨识的。
形式化地,我们用 一个只含小写字母和#的字符串来代表一块巧克力, 其中#表示该位置断开了,可能缺失了一段字符, 也可能没有。
例如: 如果我们用\(a\)#\(a\)来表示一块巧克力, 则原来它上面的话可能是\(aa\), 也可能是\(aaa\),\(aaczraa\)等等, 但不会是\(aab\)
小\(T\)有\(N\)块巧克力, 每块巧克力上都有一句话(由小写英文字母组成,不含标点) 。现在每块巧克力都断成了若干截,更糟糕的是,有一些碎片丢失了 ,但是剩下的碎片之间的顺序是可以辨识的。
形式化地,我们用 一个只含小写字母和#的字符串来代表一块巧克力, 其中#表示该位置断开了,可能缺失了一段字符, 也可能没有。
例如: 如果我们用\(a\)#\(a\)来表示一块巧克力, 则原来它上面的话可能是\(aa\), 也可能是\(aaa\),\(aaczraa\)等等, 但不会是\(aab\)

输入输出格式

输入数据

输入第一行, 一个正整数 \(N\)
接下来\(N\)行, 每行一个字符串 , 意义如题所述一个非负整数, 表示你给出的答案

输出格式:

一个非负整数, 表示你给出的答案

对于所有的数据:
\(2≤N≤500, 000\), 所有字符串 的总长不超过 \(1, 000, 000\)

对于每个子任务的特殊限制:

Subtask1(12pts) : 满足性质①
所有字符串 长度相等

Subtask2(20pts) : 满足性质①

Subtask3(23pts) : \(N≤1, 000\)

Subtask4(45pts) : 无特殊限制

性质①: 每个字符串包含恰好一个#,且这个#在字符串的开头。


感觉这个题出的非常好,考场上只拿了前两个Subtask,刚第二题去了(结果第二题还凉了)

其实第两个测试点就可以给出后面的启示了。

我们前两个测试点的字符倒着搞进字典树里,然后随便dfs一下统计就行了

观察手玩我们发现,如果两个字符串的前缀和后缀均有包含关系(这里的指一直到第一个“#”位置),那么它们两个可以搞

证明可以从递归构造的角度证明

我们把前缀和后缀分别搞进两棵字典树,就可以随便搞出\(N^2\)的算法了
(满足四个点两两是祖孙关系)

如何进一步优化复杂度呢?

我们考虑像第二步那样,\(dfs\)一棵树,然后随时统计另一颗树的贡献。

考虑我们现在做到第一棵树的点\(i\),这时候我们已经激活了\(i\)到根的在第二棵树上可能产生贡献的点了。

发现\(i\)在第二棵树上的点的子树已及它到根的那条链的点权产生了贡献

用两个树状数组维护这个过程,一个维护子树贡献。

另一个讨论链上的点对它的子树都有贡献,实际上是子树加,单点查,差分维护


Code:

#include <cstdio>
#define ls now<<1
#define rs now<<1|1
#include <cstring>
#include <vector>
#define ll long long
using namespace std;
const int N=1e6+10;
int ch[N<<1][26],tot=1,root[2]={0,1},n;
char c[N];
vector <int > to[N<<1];
ll ans,cnt[N<<1];
void in()
{scanf("%s",c);int len=strlen(c),now=root[0];for(int i=0;i<len&&c[i]!='#';i++){if(!ch[now][c[i]-'a']) ch[now][c[i]-'a']=++tot;now=ch[now][c[i]-'a'];}++cnt[now];int las=now;now=root[1];for(int i=len-1;i&&c[i]!='#';i--){if(!ch[now][c[i]-'a']) ch[now][c[i]-'a']=++tot;now=ch[now][c[i]-'a'];}++cnt[now];to[las].push_back(now);
}
int siz[N<<1],dfn[N<<1];
int dfs_order(int now)
{dfn[now]=++n;siz[now]=1;for(int i=0;i<26;i++)if(ch[now][i])siz[now]+=dfs_order(ch[now][i]);return siz[now];
}
ll sum[2][N];
ll query(int typ,int pos)
{ll x=0;while(pos){x+=sum[typ][pos];pos-=pos&-pos;}return x;
}
void change(int typ,int pos,ll del)
{while(pos<=n){sum[typ][pos]+=del;pos+=pos&-pos;}
}
void dfs(int now)
{for(int i=0;i<to[now].size();i++){int num=to[now][i];ans+=query(0,dfn[num]+siz[num]-1)-query(0,dfn[num]-1);ans+=query(1,dfn[num]);change(0,dfn[num],1);change(1,dfn[num]+1,1);change(1,dfn[num]+siz[num],-1);}for(int i=0;i<26;i++)if(ch[now][i])dfs(ch[now][i]);for(int i=0;i<to[now].size();i++){int num=to[now][i];change(0,dfn[num],-1);change(1,dfn[num]+1,-1);change(1,dfn[num]+siz[num],1);}
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) in();n=0;siz[root[1]]=dfs_order(root[1]);dfs(root[0]);printf("%lld\n",ans);return 0;
}

2018.8.14

转载于:https://www.cnblogs.com/butterflydew/p/9477032.html

安徽师大附中%你赛day2T3 巧克力 解题报告相关推荐

  1. 群赛 round#8 解题报告一 (swop,ranwen,easy)

    群赛 round#8 解题报告一 赛制: OI 难度: noip T1 交换!交换!(swop) [问题描述] ljm喜欢交换物品,他觉得这样可以与更多人分享好的事物. 有一天,lzx给了ljm n本 ...

  2. 关于安徽赛区推广校赛的实施办法

    关于安徽赛区 推广校赛的实施办法 全国组委会:   安徽赛区作为第一个省级赛区自2010年举办至今,受到安徽省教育厅和安徽各高校高度认可,是安徽省教育厅重点支持的大学生学科和技能竞赛A类赛事.但安徽赛 ...

  3. 中国最新奥数竞赛成绩出炉:南师大附中女生严彬玮满分夺冠!60人国家集训队名单公布...

    雷刚 发自 副中心  量子位 报道 | 公众号 QbitAI 第35届中国数学奥林匹克竞赛成绩公布. 同时也意味着新一届中国奥数国家集训队,正式集结. 60名中学生. 湖北贡献9人.广东7人,上海6人 ...

  4. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  5. 2021年兰州师大附中高考成绩查询,2021年兰州重点高中名单及排名,兰州高中高考成绩排名榜...

    "一千个人眼中,就有一千个哈姆雷特".关于兰州高职学校排名,每个人的观点也是各不相同,今天就给大家分享一下我心中的兰州高中排名及格局分布,主要参考依据是近年中考录取分数线及高考成绩 ...

  6. 2021年兰州师大附中高考成绩查询,西北师范大学附属中学2021年排名

    我们想了解的是这个学校的师资怎样,办学这么久以来有获得了什么样的成绩,获得了什么样的荣誉,这个学校是省级示范高中还是市级示范高中,而这个级别的什么样的排名情况,下面我为大家整理了作为省级示范高中学校的 ...

  7. 南师大附中2021高考成绩查询,2021高考倒计时,你有一份师大附中专属回忆录待查收~...

    原标题:2021高考倒计时,你有一份师大附中专属回忆录待查收~ NO.1442 距离2021年高考不到24小时...... 对于大部分人来说,人生中没有任何一场考试比高考更加惊心动魄. 同样地,也没有 ...

  8. 2021高考甘肃师大附中成绩查询,2021甘肃理科高考成绩排名一分一档表,甘肃高考理科成绩排名查询...

    2015甘肃理科高考成绩排名一分一档表甘肃高考理科成绩排名查询 肃省2017年高考文科状元出炉,来自民乐一中的王复英以总分676分摘取理科第一名桂冠.文科状元惠雅婕来自西北师大附中,总分660分.恭喜 ...

  9. 山东科技大学第二届ACM校赛解题报告

    这次校赛的目的,是为了省赛测试各种程序是否有问题. 热身赛的逗比题有点打击我,感觉正式赛应该不会出这种问题.开始的时候直接上了A题,然后大概是第六,前面好多友情队,正式队排名第二. 然后读了读B题,稍 ...

  10. 武汉工程大学第一届程序设计女生赛(牛客contest 4746)解题报告 Apare_xzc

    武汉工程大学第一届程序设计女生赛解题报告 xzc 2020.3.8 比赛链接:武汉工程大学第一届程序设计女生赛 A. Multiplication (101/861) 分析: 问x平方几次后就会> ...

最新文章

  1. windows版Cacti-0.8.8h一键安装
  2. input自适应_一种Dynamic ReLU:自适应参数化ReLU(调参记录26)Cifar10~95.92%
  3. codeforces 909C. Python Indentation
  4. lagom的微服务框架_微服务有麻烦吗? Lagom在这里为您提供帮助。 试试吧!
  5. ISA之三种客户端访问
  6. django-后台管理-编辑页的选项
  7. 广东计算机等级考试一级试题,广东省计算机等级考试(一级)仿真试题
  8. BZOJ1396: 识别子串(后缀自动机,线段树)
  9. ghost方式批量安装win7
  10. 吉林大学超星MOOC学习通高级语言程序设计 C++ 实验03 模块化程序设计(2021级)
  11. GitHub协同工作
  12. 蚂蚁金服java年终奖,蚂蚁金服发布年终奖调查结果 超六成人无缘年终奖
  13. 1m照片的宽和高是多少_1M图片大小多少啊?
  14. 基于纠错编码的数字水印matlab,method robustness是什么意思
  15. Android R- AudioManager之音量调节(一)
  16. 微软AI 绘图工具+ChatGPT免费用,10秒轻松出图,超详细教程,纯干货分享
  17. Java汉语转拼音首字母并大写利用Pinyin4j(多音字识别)(中午括号识别)
  18. 如何评价 2021 考研政治题,难度如何?
  19. 每日一题2021/5/22:黑板异或
  20. Play-Utils:一个专门为 Play Framework 开发的实用工具包模块

热门文章

  1. c语言李白喝酒答案,思维的体操——李白喝酒(2014年春蓝桥杯个人赛)
  2. openlayers3中,在地图上添加静态边界线
  3. Hyperledger Fabric系统架构
  4. 古代十二时辰,时辰,时辰对照表,十二时辰与时间对照表,12时辰,时辰表
  5. 传统蓝牙base on pincode配对以及安全简单配对(Secure Simple Pairing)流程介绍
  6. java clh_【Java并发编程实战】—– AQS(四):CLH同步队列
  7. Fuzzy Clustering详解
  8. ASIFT算法过程实现 --- 配置避坑指南
  9. InTra【异常检测:Reconstruction_based】
  10. vue项目使用vue-amap调用高德地图api详细步骤