题目链接:

http://www.spoj.com/problems/KAOS/

题意:

给定n个字符串,统计字符串(s1, s2)的对数,使得s1的字典序比s2的字典序要大,s1反一反(abc==>cba,记为s1’)比s2’的字典序要小。

题解:

按字符串的字典序排序,从小到大枚举,假设现在考虑到了字符串s1,那么我们已经处理过了所有字典序小于s1的字符串s2,我们关心的是这些字符串中满足s1’小于s2’的s2的数目。Ok,这个task可以完美地用trie树解决。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 #define MS(a) memset(a,0,sizeof(a))
 5 #define MP make_pair
 6 #define PB push_back
 7 const int INF = 0x3f3f3f3f;
 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
 9 inline ll read(){
10     ll x=0,f=1;char ch=getchar();
11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
13     return x*f;
14 }
15 //
16 const int maxn = 1e6+10;
17
18 string str[maxn];
19 int a[maxn][30],f[maxn];
20 int cnt;
21
22 void insert(string s){
23     int len = s.size();
24     int now = 0;
25     for(int i=len-1; i>=0; i--){
26         if(!a[now][s[i]-'a'])
27             a[now][s[i]-'a'] = ++cnt;
28         now = a[now][s[i]-'a']; // 爬到下一层
29         ++f[now];
30     }
31 }
32
33 ll calc(string s){
34     int len = s.size(),now=0;
35     ll ans = 0;
36     for(int i=len-1; i>=0; i--){
37         for(int j=s[i]-'a'+1; j<26; j++)
38             ans += f[a[now][j]]; // 每一层的贡献就是比当前串字典序大的字符串
39         now = a[now][s[i]-'a'];
40     }
41
42     for(int i=0; i<26; i++)
43         ans += f[a[now][i]];
44     return ans;
45 }
46
47 int main(){
48     int n;
49     cin >> n;
50     for(int i=0; i<n; i++)
51         cin >> str[i];
52     sort(str,str+n);
53
54     ll ans = 0;
55     for(int i=0; i<n; i++){
56         insert(str[i]);
57         ans += calc(str[i]);
58     }
59
60     cout << ans << endl;
61
62     return 0;
63 }

转载于:https://www.cnblogs.com/yxg123123/p/6827582.html

Wannafly 每日一题 2016-12-26 KAOS 字典树相关推荐

  1. 每日一题4.12.1

    每日一题4.12.1 年会抽奖 ** 参考答案:**

  2. 每日一题 20.12.18 LeetCode 389. 找不同java题解

    嚯 第一次做力扣的每日一题 题目 https://leetcode-cn.com/problems/find-the-difference/ 方法一:计数 时间复杂度:O(N),其中 N 为字符串的长 ...

  3. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.26日(2019省赛A组第4题)

    2021年寒假每日一题,2017~2019年的省赛真题.本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供.每日一题,关注蓝桥杯专栏: https://blog.csdn.net/w ...

  4. 【每日刷题3.12】5道算法+15道面试 - 阿V

    感觉算法太占时间了,而且刷的差不多了,现在开始专攻面试!加油~明天阿里笔试. 面试题 (一面-项目介绍+基础面) 1. 自我介绍 (游戏测试工程师) 看了多篇文章,说自我介绍不能太短,最好是三分钟,哈 ...

  5. 蓝桥杯大赛— —每日一题(12、城堡问题)

    [题目描述] = Wall | = No wall = No wall 图1是一个城堡的地形图.请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大.城堡被分割成m*n(m≤50,n≤50)个方 ...

  6. 每日一题 2020.05.26

    按扫描二维码即可答题,关注服务号"墨天轮平台",每日提醒不会错过! 网页版链接:https://www.modb.pro/test

  7. 每日一题(12)—— .h头文件中ifndef/define/endif的作用

     .h头文件中ifndef/define/endif的作用? 分析: 防止头文件被重复包含. #ifndef _TEST_H_ #define _TEST_H_/* test.h */#endif / ...

  8. 【每日早报】2019/12/26

    ✦ 快手成央视2020年春晚独家互动合作伙伴,除夕将发10亿现金红包 ✦ 微信回应朋友圈表情包评论关闭:之前是灰度测试,目前功能暂停 ✦ 腾讯云发布云视频会议产品"腾讯会议",瞄准 ...

  9. Leetcode每日一题:100.same-tree(相同的树)

    思路:这题首先想到了递归,如果当前p,q的值相等,那么只需比较它们的左子树和右子树,把问题分解成子问题,这样循环比较下去,当两者都是NULL的时候,返回true即可: 这里要注意边界条件: 第1,比较 ...

  10. 安卓 每日一题 2019年9-12月问题及答案

    最新 文章连接,本文不再同步 安卓 每日一题 2019年9-12月问题及答案 文章目录 安卓 每日一题 2019年9-12月问题及答案 安卓2019年09月每日一题 安卓2019年10月每日一题 安卓 ...

最新文章

  1. PoseFormer:首个纯基于Transformer的 3D 人体姿态估计网络,性能达到 SOTA
  2. linux正则表达式sed
  3. 疑难杂症——解决 Cinder 僵尸卷问题
  4. java自学小段 产生随机数
  5. C# + .net下使用serialPort做串口开发 1
  6. java怎么做系统_Java系统监控怎么做
  7. 2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势(下)
  8. 从0移植uboot (二) _启动流程分析
  9. NVIDIA教你用TensorRT加速深度学习推理计算 | 量子位线下沙龙笔记
  10. 人生的第一个js插件
  11. Node.js:使用session存储用户信息
  12. Jrebel 最新激活方式(2018.07.26)
  13. 【转】25 个常用 Matplotlib 图的 Python 代码
  14. 记录团队日常工作清单用什么办公软件?
  15. 阿卡迪亚大学计算机科学专业,阿卡迪亚大学世界排名解读
  16. Java web课程设计-购物系统
  17. 无刷电机控制基础(1)——结构和驱动电路
  18. 计算机专业b区大学,b区考研学校,b区考研学校排名。
  19. 基于Python医学院校二手书管理毕业设计-附源码201704
  20. web前端各种浏览器版本测试工具-turbo

热门文章

  1. 向Yahoo Mail的主页学习
  2. vue使用node-sass@4.9.0时,npm intall出错
  3. Thingsboard 3.1.0 - 规则链:转换数据结构
  4. Python 文件(文件夹)匹配(glob模块)(转载)
  5. C++11 线程池的实现(基于muduo)
  6. MySQL 表分区功能详解
  7. MySQL 各种变量
  8. Spring之IOC容器
  9. zynq跑linux所需内存大小,Zynq-Linux移植学习笔记之33-CMA连续物理内存配置
  10. linux启动mysql_允许远程连接到MySQL数据库服务器的步骤