题目大意:给出n种串,每种串有无限多个,现在要在这n种串中选择m个链接起来,链接的规则是:如果a串的后缀(len >= 2 )是b串的前缀,那么就可以把b接到a的后面,问最终可以组成多少个不同的串
首先应该排除重复的,因为重复的不会多产生链接。然后找出对于第i种串,后面可以接哪几个串。
然后dp[i][j],当链接了i个串后,以第j个串结尾的有多少种。这样dp[i][j] = ∑dp[i-1][k] (k串后面可以接j)
其实可以从暴力吧代码看出三重循环特像矩阵相乘。还有一点需注意:如果状态转移是利用if判断,而不是重新自己构造一个矩阵(只含01表示是否可以转换),那么不容易看出是矩阵相乘。因为矩阵相乘满足结合律,所有可以有。
因为m<=1e9,所以用矩阵优化,初始时dp[1][i]全部为1,计算矩阵temp.a[i][j],如果第i个串后面可以接j,那么temp.a[i][j] = 1,否则为0,这样dp[i]和temp矩阵相乘都会得到dp[i+1],使用矩阵快速幂计算出dp[1]*(temp.a)^(m-1