[SDOI2014] 数数
- 题意:问有多少个<=n(\(10^{1201}\))的数满足下面所给的模式串没有在其中出现过
- 思路:首先一堆串没在构造的串中,套路就是AC自动机上dp,不经过cnt[]>0的点。
不过<=n怎么做呢?从n范围容易想到数位dp。
不过有一种更巧妙的方法:
首先位数(类似康托展开:每次讨论每一位取值,值 ps.处理前导零
因此状态需要:\(dp[i][j]\):从\(j\)点走\(i\)步可以构成串的方案数。也很好转移。 - code:
#include
using namespace std;
const int N=1e5+5;
const int mod=1e9+7;
typedef long long ll;
char s[N],a[N];
int n;
struct AC {
int go[N][11],nd,cnt[N],fail[N];
ll dp[1999][2005];
void Insert() {
int sz=strlen(s),u=0;
for(int i=0;i