当前位置: 首页 > news >正文

[CodeForces-759D]Bacterial Melee

题目大意:
  有一串n个字母,每个位置的字母可以同化边上的一个字母,
  比如:ab可以变成aa或者bb。
  相对的两个同化不能同时发生,比如ab不能变成ba。
  现在给你一个字符串,问你经过任意次数的同化过程,最多能生成多少个字符串。

思路:
  考虑同化过后的字符串与同化前的字符串的关系。
  如果我们把一个字符串中相邻且相同的字母缩在一起,那么我们可以发现每一次同化就相当于从原串中去掉了一个字符。
  这也就意味着同化过后的串一定是原串的一个子序列。
  同样,如果一个串是原串的一个子序列,它一定能由原串同化而来。
  我们可以先统计一下原串不同长度子序列的个数。
  对于一个长度为l的子序列,它里面有n-l个字符被缩过,那么缩之前的串总共有C(n,l)种可能。
  不同的子序列数量可以用DP求出来。
  f[i][j]表示以字符j结尾的长度为i的子序列数量,则f[i][j]=sum{f[i-1][k]|k≠j}+1,枚举i,j,k,时间复杂度O(n^2*26)。
  如果直接枚举k会TLE,只能过11个点,我们可以考虑用sum[i]记录长度为i的子串的数量和。
  由于结尾位置的字符已确定,所以组合数用C(n-1,l-1)算,时间复杂度O(n^2)。

 1 #include<cstdio>
 2 #include<cctype>
 3 typedef long long int64;
 4 inline int getint() {
 5     register char ch;
 6     while(!isdigit(ch=getchar()));
 7     register int x=ch^'0';
 8     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
 9     return x; 
10 }
11 const int N=5001,SIGMA=27,mod=1e9+7;
12 char s[N];
13 int f[N][SIGMA],sum[N],fact[N],factinv[N];
14 inline int idx(const char &ch) {
15     return ch-'a'+1;
16 }
17 void exgcd(const int &a,const int &b,int &x,int &y) {
18     if(!b) {
19         x=1;
20         y=0;
21         return;
22     }
23     exgcd(b,a%b,y,x);
24     y-=a/b*x;
25 }
26 inline int inv(const int &x) {
27     int ret,tmp;
28     exgcd(x,mod,ret,tmp);
29     return (ret%mod+mod)%mod;
30 }
31 inline int C(const int &n,const int &m) {
32     return (int64)fact[n]*factinv[n-m]%mod*factinv[m]%mod;
33 }
34 int main() {
35     const int n=getint();
36     scanf("%s",s);
37     fact[0]=factinv[0]=1;
38     for(register int i=1;i<n;i++) {
39         fact[i]=(int64)fact[i-1]*i%mod;
40         factinv[i]=inv(fact[i]);
41     }
42     sum[0]=1;
43     for(register int i=0;i<n;i++) {
44         const int ch=idx(s[i]);
45         for(register int i=1;i<=n;i++) {
46             sum[i]=(sum[i]-f[i][ch]+mod)%mod;
47             f[i][ch]=(sum[i-1]-f[i-1][ch]+mod)%mod;
48             sum[i]=(sum[i]+f[i][ch])%mod;
49         }
50     }
51     int ans=0;
52     for(register int i=1;i<=n;i++) {
53         ans=(ans+(int64)C(n-1,i-1)*sum[i]%mod)%mod;
54     }
55     printf("%d\n",ans);
56     return 0;
57 }

 

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

相关文章:

  • MongoDB lsm降低 disk lantency
  • CentOS7 LVM添加硬盘及扩容
  • Hanlp等七种优秀的开源中文分词库推荐
  • python基础===抽象
  • 【洛谷 P2303】 [SDOi2012]Longge的问题 (欧拉函数)
  • 【iOS-cocos2d-X 游戏开发之十六】Cocos2dx编译后的Android自动使用(-hd)高清图设置自适应屏幕...
  • 了解一下ES6: let const
  • 【斗医】【12】Web应用开发20天
  • WCF和IIS宿主的ASP.NET 共享会话
  • ORDER BY,GROUP BY 和DI STI NCT 优化
  • JS中字符串转义
  • 【SSH网上商城项目实战03】使用EasyUI搭建后台页面框架
  • ORA-00119: invalid specification for system parameter LOCAL_LISTENER;
  • Mybatis介绍
  • USB数据采集卡:labjack T7、T7 Pro系列的技术特点
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • Android Volley源码解析
  • GraphQL学习过程应该是这样的
  • Java,console输出实时的转向GUI textbox
  • java正则表式的使用
  • PermissionScope Swift4 兼容问题
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • - 概述 - 《设计模式(极简c++版)》
  • 每天一个设计模式之命令模式
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 首页查询功能的一次实现过程
  • 用jQuery怎么做到前后端分离
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 正则与JS中的正则
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​iOS实时查看App运行日志
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (C++)八皇后问题
  • (二十三)Flask之高频面试点
  • (七)Knockout 创建自定义绑定
  • (十三)Maven插件解析运行机制
  • (循环依赖问题)学习spring的第九天
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .bashrc在哪里,alias妙用
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET Core跨平台微服务学习资源
  • .NET 发展历程
  • .net 设置默认首页
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • @AutoConfigurationPackage的使用
  • @SuppressLint(NewApi)和@TargetApi()的区别