求助
查看原帖
求助
480934
xqqQwQ_楼主2022/8/22 18:43

有无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;
}
2022/8/22 18:43
加载中...