题目描述

小x有n个小姊妹(根据典故,我们假设n≤3000)。他每天都喜欢按不同标准给小姊妹们排(da)序(fen)。今天,他突然对小姊妹们的名字产生了兴趣。他觉得小姊妹的魅力和她们的名字有密切联系,于是他觉得所有有相似的名字的小姊妹必须排在一起。

相似是指,名字的开头一个或若干个连续字母相同。于是,小x定下了如下规则:在任何以同样的字母序列开头的名字之间,所有名字开头必须是同样的字母序列。

比如,像MARTHA和MARY这两个名字,它们都以MAR开头,所以像MARCO或MARVIN这样的名字可以插入这两个名字中间,而像MAY这样的就不行。
显然,按字典序排序是一个合法的排序方案,但它不是唯一的方案。你的任务就是计算出所有合法的方案数。考虑到答案可能很大,输出答案 mod 1 000 000 007。

输入

第一行一个整数n,小x的小姊妹个数。
第2~n+1行,每行一个字符串,代表这个小姊妹的名字。

输出

一行一个整数,合法的方案数。

数据范围限制

对于60%的数据:3 ≤ n ≤ 10。

对于100%的数据:3 ≤ n ≤ 3000,1 ≤ 字符串长度 ≤ 3000,并且只含有大写字母。

Code

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
int n;
long long fac[3010];
long long ans;
string a[3010];
const int mod = 1e9 + 7;
long long factor(int k)
{if(k == 0)return 0;if(fac[k])return fac[k];fac[k] = (factor(k - 1) * k) % mod;return fac[k];
}
long long dg(int k,int beg,int len)
{if(len == 1)return 1;int buc[30];int begin[30];int count = 0;memset(buc,0,sizeof buc);memset(begin,0,sizeof begin);long long ret = 1;for(register int i = beg + len - 1;i >= beg;--i){if(k >= a[i].length()){++buc[0],begin[0] = i;continue;}++buc[a[i][k] - 'A' + 1],begin[a[i][k] - 'A' + 1] = i;}for(register int i = 0;i <= 26;++i)if(buc[i])ret = (ret * dg(k + 1,begin[i],buc[i])) % mod,++count;return (ret * factor(count)) % mod;
}
int main()
{freopen("ranking.in","r",stdin);freopen("ranking.out","w",stdout);scanf("%d",&n);fac[1] = 1;for(register int i = 1;i <= n;++i)cin >> a[i];sort(a + 1,a + n + 1);ans = dg(0,1,n);printf("%lld\n",ans);
}

1733.ranking相关推荐

  1. 一文理解Ranking Loss/Margin Loss/Triplet Loss

    点击蓝字  关注我们 作者丨土豆@知乎 来源丨https://zhuanlan.zhihu.com/p/158853633 本文已获授权,未经作者许可,不得二次转载. 前言 Ranking loss在 ...

  2. 《Revisiting Salient Object Detection! Simultaneous Detection, Ranking, and Subitizing of Multiple Sa

    <Revisiting Salient Object Detection! Simultaneous Detection, Ranking, and Subitizing of Multiple ...

  3. Ranking relevance in yahoo search (2016)论文阅读

    文章链接 https://www.kdd.org/kdd2016/papers/files/adf0361-yinA.pdf abstract 点击特征在长尾query上的稀疏性问题 基础相关性三大技 ...

  4. POJ 1733 Parity game(带权并查集)

    题目链接:http://poj.org/problem?id=1733 题目大意:给你m条信息,每条信息告诉你区间l~r的1的个数是奇数还是偶数,如果后面出现信息跟前面矛盾则这条信息是错误的,问在第一 ...

  5. Crawling - Computing Ranking 很长时间, 怎么办?

    MOSS中遇到爬网状态保持Crawling - Computing Ranking不变. 你可以尝试编写SharePoint Object Model的代码来解决这个问题. 关键代码如下: Micro ...

  6. 论文笔记之:End-to-End Localization and Ranking for Relative Attributes

    End-to-End Localization and Ranking for Relative Attributes arXiv Paper  摘要:本文提出一种 end-to-end 的属性识别方 ...

  7. POJ 3275 Ranking the Cows (floyd传递闭包)

    Ranking the Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2248   Accepted: 1045 ...

  8. 知乎推荐页Ranking构建历程和经验分享

    本次分享主题主要从以下是三个方面展开: 知乎推荐页场景和Ranking历程介绍: 深度学习在Ranking中的尝试和应用现状: Ranking面临的问题和未来研究方向. 首先大家看一下知乎APP的推荐 ...

  9. PAT甲级1141 PAT Ranking of Institutions :[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数、排名

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:和下面这题是一道题: PAT甲级1137 Final Grading:[C++题解]结构体.排序.哈希表.结构体构造函数.结构体内写函 ...

最新文章

  1. BigInteger类实例的构造过程——JDK源码解析
  2. android:layout_marginbottom=,Android: Retrieve layout_marginBottom programmatically?
  3. Exec l 中分列的作用
  4. 选股方法-陶博士-月线反方法的思路来源
  5. SAPUI5教程——URLHelper的使用技巧
  6. C/C++ Npcap包实现数据嗅探
  7. Xcode升级之后,报 Moudule ‘xxx‘ not found,或 Could not find module ‘xxx‘ for target ‘arm64-apple-ios
  8. word之中快速插入已有公式的几种方法
  9. network secruity studay day2
  10. 数据用什么挖?数据挖掘常用工具分享
  11. 安装 OpenCC 简繁体中文转换
  12. python手把手安装_小白手把手搭建python开发环境
  13. / 和 /* 的区别
  14. Android--微信支付
  15. OSAL系统框架专题
  16. Qt中的网络编程(TCP)
  17. 【读书笔记】金字塔原理-学习总结
  18. Win7及以上系统自带Windows 光盘映像刻录机
  19. html 制作人物模型,3dsmax动漫人物制作教程
  20. 今日芯声 | 美团王兴回应不支持支付宝:淘宝为什么不支持微信支付?

热门文章

  1. 20年半年总结—默默的活着真是快活极了
  2. php第一章:4.Apache加载php模块 且分配工作给php
  3. python中可以终结一个循环的保留字是_以下可以终结一个循环的保留字是
  4. 电子拍卖系统开发第二天
  5. 淘宝API接口,商品详情,产品页面信息接口调用展示
  6. html5行星环绕,Two.js实现星球环绕动画效果
  7. GitHub开源14.5万行阿波罗11号源代码
  8. 跟着我从零开始入门FPGA(一周入门系列 第一天)
  9. 实现断网收银_超市收银系统排名前五
  10. 财富:保罗·艾伦转向新领域