题目描述

给定 $n$ 和 $m$ ,求所有 长度为 $n$ ,字符集大小为 $m$ 的字符串,每个前缀的最短循环节长度乘积 的总和。

$n\le 12,m\le 10^9$


题解

DFS+KMP

对于字符串中的每一种字符,将其看作:该字符第一次出现位置之前的字符种类数+1,把得到的序列称为“该字符串的最小表示”。

那么显然本题中最小表示相同的字符串的答案是一样的。$n$ 很小,因此可以暴搜最小表示序列,然后计算贡献,乘以最小表示为这个序列的字符串个数统计到答案中。

统计贡献时使用到KMP的一个小结论:长度为 $n$ 的字符串最短循环节长度为 $n-next[n]$ 。因此求出 $next[]$ ,对每个前缀算一下乘起来。

最小表示为该序列的字符串个数是一个排列数,为 $A_{m}^{字符种类数}$ ,预处理排列计算即可。

经过一个小dp程序可以计算出 $n=12$ 时最小表示个数为4213597,因此时间复杂度为 $O(4213597·12)$

#include <cstdio>
#define mod 998244353
typedef long long ll;
int s[13] , next[13] , n , m;
ll a[13] , ans;
void dfs(int p , int v)
{
int i;
if(p == n)
{
int j;
ll ret = 1;
for(j = -1 , i = 1 ; i <= n ; i ++ )
{
while(~j && s[j] != s[i - 1]) j = next[j];
next[i] = ++j , ret = (ret * (i - j)) % mod;
}
ans = (ans + ret * a[v]) % mod;
return;
}
for(i = 1 ; i <= v ; i ++ ) s[p] = i , dfs(p + 1 , v);
if(v + 1 <= m) s[p] = v + 1 , dfs(p + 1 , v + 1);
}
int main()
{
int i;
scanf("%d%d" , &n , &m);
a[0] = 1;
for(i = 1 ; i <= n && i <= m ; i ++ ) a[i] = a[i - 1] * (m - i + 1) % mod;
next[0] = -1 , dfs(0 , 0);
printf("%lld\n" , ans);
return 0;
}

【bzoj5130】[Lydsy12月赛]字符串的周期 DFS+KMP的更多相关文章

  1. bzoj5130: [Lydsy1712月赛]字符串的周期

    这道题很有意思啊. 字符串循环节用KMP(手推一下) 假如是26^12肯定很不滋磁 但是可以发现ABA和BCB和BAB这些都是等价的 那就把最小的拿出来搞再乘个排列数就好了 #include<c ...

  2. poj2406(求字符串的周期,kmp算法next数组的应用)

    题目链接:https://vjudge.net/problem/POJ-2406 题意:求出给定字符串的周期,和poj1961类似. 思路:直接利用next数组的定义即可,当没有周期时,周期即为1. ...

  3. bzoj5130 字符串的周期(kmp,最小表示法)

    bzoj5130 字符串的周期(kmp,最小表示法) bzoj 题解时间 m很大,n很小. 周期很容易求,就是kmp之后n-fail[n]. 之后对于枚举所有的字符串用最小表示法,暴力搜索. 能过就完 ...

  4. KMP + BZOJ 4974 [Lydsy1708月赛]字符串大师

    KMP 重点:失配nxtnxtnxt数组 意义:nxt[i]nxt[i]nxt[i]表示在[0,i−1][0,i-1][0,i−1]内最长相同前后缀的长度 图示: 此时nxt[i]=jnxt[i]=j ...

  5. bzoj 4974: [Lydsy八月月赛]字符串大师

    4974: [Lydsy八月月赛]字符串大师 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 371  Solved: 190[Submit][Statu ...

  6. 【kmp】 字符串最大周期

    大侠住店 TimeLimit: 1 Second MemoryLimit: 32 Megabyte Totalsubmit: 116 Accepted: 64 Description 有一天晚上,一位 ...

  7. POJ--2406Power Strings+KMP求字符串最小周期

    题目链接:点击进入 事实上就是KMP算法next数组的简单应用.假设我们设这个字符串的最小周期为x 长度为len,那么由next数组的意义,我们知道len-next[len]的值就会等于x.这就是这个 ...

  8. 【思维题 kmp 构造】bzoj4974: [Lydsy1708月赛]字符串大师

    字符串思博题这一块还是有点薄弱啊. Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节 .给定一个长度 ...

  9. BZOJ4974:[Lydsy1708月赛]字符串大师(逆模拟KMP)

    题目描述 一个串T是S的循环节,当且仅当存在正整数k,使得S是T k  Tk (即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每 ...

随机推荐

  1. 20155339《java程序设计》第十二周课堂实践总结

    Arrays和String单元测试 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常,错误和边界情况 String类 charAt split Arrays类 s ...

  2. Object重写equals()、hashcode()方法的原因

    一.问题 在我们新建java对象的时候,如果后期用到对象比较,就必须重写equals(0.hashcode()方法 为什么必须重写这两个方法? 只是比较相等的话,重写equals()方法不就可以吗?为 ...

  3. 运行ntpdate报错:Temporary failure in name resolution

    一.问题报错: 忽然发现某台机器时间慢了些几分钟,之前没有搭建ntpd服务,目前都是使用的ntpdate加定时任务进行时间同步.直接执行ntpdate报错如下: # ntpdate cn.pool.n ...

  4. linux系统CPU内存磁盘监控发送邮件脚本

    #!/bin/bashexport PATHexport LANG=zh_CN.UTF-8###top之后输入数字1,可以查看每颗CPU的情况.###先配置好mailx邮箱账号密码:#cat>/ ...

  5. 学习HTML 第一节.小试牛刀

    此贴并非教学,主要是自学笔记,所述内容只是些许个人学习心得的记录和备查积累,难以保证观点正确,也不一定能坚持完成. 如不幸到访,可能耽误您的时间,也难及时回复,贴主先此致歉.如偶有所得,相逢有缘,幸甚 ...

  6. Mac系统STF自动化环境搭建及部署踩坑记录

    因为公司需要寻找一个免root的自动化测试方案,所以以前做的老方案需要被替代.一阵搜寻找到了这个框架,但是部署起来很是折腾,搞了一下午终于搞定,顺便记录一下过程,有需要的自取. 转载请注明出处:htt ...

  7. PHP手动环境搭建之WAMP

    第一步:安装apache程序 首先需要去Apache官网下载Apache2.4(http://httpd.apache.org/download.cgi),操作如下图所示: 下载完成后把它解压出来,然 ...

  8. 785. Is Graph Bipartite?

    Given an undirected graph, return true if and only if it is bipartite. Recall that a graph is bipart ...

  9. JavaScript事件冒泡和捕获

    事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件. 事件冒泡是自下而上的去触发事件. 绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获.true,事件捕获:fa ...

  10. pyqt5实现SMTP邮件发送

    # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'SMTP.ui' # # Created b ...