有无80分老哥
我卡在#2和#10两个点上了
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2005;
const int mo=1e9+7;
int Trie[MAXN][11],fail[MAXN],tot=0;
int m;
string n;
int vis[MAXN];
int f[1202][MAXN][2];
void getf(){
queue<int> q;
for(int i=0;i<=9;i++){
if(Trie[0][i]){
q.push(Trie[0][i]);
fail[Trie[0][i]]=0;
}
}
// vis[0]=1;
while(!q.empty()){
int nown=q.front();
q.pop();
for(int i=0;i<=9;i++){
if(Trie[nown][i]){
fail[Trie[nown][i]]=Trie[fail[nown]][i];
q.push(Trie[nown][i]);
}
else Trie[nown][i]=Trie[fail[nown]][i];
}
if(vis[fail[nown]]) vis[nown]=1;
}
return;
}
signed main(){
cin>>n;
cin>>m;
for(int i=1;i<=m;i++){
string s;
cin>>s;
int cur=0;
for(int j=1;j<=s.length();j++){
if(!Trie[cur][s[j-1]-'0']) Trie[cur][s[j-1]-'0']=++tot;
cur=Trie[cur][s[j-1]-'0'];
}
vis[cur]=1;
}
int cur=Trie[0][0];
Trie[0][0]=0;
while(cur){
int tmp=cur;
cur=Trie[cur][0];
Trie[tmp][0]=0;
}
getf();
int len=n.length();
f[len+1][0][1]=1;
for(int i=len+1;i>=2;i--){
for(int j=0;j<=tot;j++){
for(int lim=0;lim<=1;lim++){
for(int k=0;k<=(lim==1?(n[len-i+1]-'0'):9);k++){
if(f[i][j][lim]==0) continue;
// if(!Trie[j][k]) continue;
// cout<<i<<" "<<j<<" "<<lim<<" "<<f[i][j][lim]<<endl;
// if(i==len+1&&k==0) continue;
if(!vis[Trie[j][k]]) f[i-1][Trie[j][k]][lim&&(k==n[len-i+1]-'0')]=(f[i-1][Trie[j][k]][lim&&(k==n[len-i+1]-'0')]%mo+f[i][j][lim]%mo)%mo;
// if(i-1==1&&vis[Trie[j][k]]==0&&(lim&&(k==n[len-i+1]-'0'))==0){
// cout<<i-1<<" "<<Trie[j][k]<<" "<<(lim&&(k==n[len-i+1]-'0'))<<" "<<f[i-1][Trie[j][k]][lim&&(k==n[len-i+1]-'0')]<<endl;
// cout<<i<<" "<<j<<" "<<k<<" "<<lim<<" "<<f[i][j][lim]<<endl;
// }
}
}
}
}
int total=0;
for(int i=0;i<=tot;i++) total=(total%mo+(f[1][i][0]+f[1][i][1])%mo)%mo;
cout<<total-1<<endl;
return 0;
}