1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int M=1210; const int L=1510; const int mod=1e9+7; class Trie{ public: int ch[L][10],cnt; bool mk[L]; Trie(){cnt=1;} void insert(char*s){ int n_junior=strlen(s+1),p=1; for(int i=1;i<=n_junior;i++){ int c=s[i]-'0'; if(!ch[p][c]) ch[p][c]=++cnt; p=ch[p][c]; } mk[p]=1; } }; int n,m,f[2][L][2],ans; char w[M],s[L]; class Acam:public Trie{ public: int fa[L]; void build(){ for(int i=0;i<=9;i++) ch[0][i]=1; queue<int> q; while(q.size()) q.pop(); //我因为没清零WA了5次 q.push(1); while(q.size()){ int x=q.front();q.pop(); mk[x]|=mk[fa[x]]; for(int c=0;c<=9;c++) if(ch[x][c]){ fa[ch[x][c]]=ch[fa[x]][c]; q.push(ch[x][c]); } else ch[x][c]=ch[fa[x]][c]; } } void dp(){ for(int i=1;i<=w[1]-'0';i++) if(!mk[ch[1][i]]) (f[1][ch[1][i]][i==w[1]-'0']+=1)%=mod; for(int i=2;i<=m;i++){ memset(f[i&1],0,sizeof f[i&1]); for(int j=1;j<=9;j++) if(!mk[ch[1][j]]) (f[i&1][ch[1][j]][0]+=1)%=mod; for(int j=1;j<=cnt;j++){ if(mk[j]) continue; if(f[(i-1)&1][j][0]) for(int c=0;c<=9;c++) if(!mk[ch[j][c]]) (f[i&1][ch[j][c]][0]+=f[(i-1)&1][j][0])%=mod; if(f[(i-1)&1][j][1]) for(int c=0;c<=w[i]-'0';c++) if(!mk[ch[j][c]]) (f[i&1][ch[j][c]][c==w[i]-'0']+=f[(i-1)&1][j][1])%=mod; } } for(int i=1;i<=cnt;i++) if(!mk[i]) (((ans+=f[m&1][i][0])%=mod)+=f[m&1][i][1])%=mod; } }t; int main(){ scanf("%s\n%d",w+1,&n),m=strlen(w+1); for(int i=1;i<=n;i++) scanf("%s",s+1),t.insert(s); t.build(); t.dp(); printf("%d\n",ans); return 0; }
- 1
信息
- ID
- 5195
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 39
- 已通过
- 7
- 上传者