这个前导0到底怎么处理啊!!!!!
查看原帖
这个前导0到底怎么处理啊!!!!!
1103272
jiang1327554003楼主2024/9/25 23:54
#include<bits/stdc++.h>
using namespace std;
const int INF=1e9,mod=1e9+7;
string n,z[105];
int id,d[1205][150005][2],it;
struct node{
    int ch[10],fa,v;
    bool isend;
    node (){
        memset(ch,0,sizeof(ch));
        isend=0;
        v=0;
    }
}tr[150005];
void insert(string s){
    int p=0;
    for(int i=0;i<s.length();i++){
        int x=s[i]-'0';
        if(tr[p].ch[x]==0)tr[p].ch[x]=++id;
        p=tr[p].ch[x];
        tr[p].v=x;
    }
    tr[p].isend=1;
}
void get_fail(){
    int p=0;
    tr[p].fa=p;
    queue<int>q;
    for(int i=0;i<10;i++){
        if(tr[p].ch[i]!=0){
            tr[tr[p].ch[i]].fa=p;
            q.push(tr[p].ch[i]);
        }else tr[p].ch[i]=p;
    }
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int x=0;x<10;x++){
            if(tr[u].ch[x]!=0){
                tr[tr[u].ch[x]].fa=tr[tr[u].fa].ch[x];
                q.push(tr[u].ch[x]);
            }else tr[u].ch[x]=tr[tr[u].fa].ch[x];
        }
    }
}
void dp(){
    d[0][0][1]=1;
    for(int i=0;i<n.length();i++){
            for(int k=0;k<=id;k++){
                for(int x=0;x<10;x++){
                    if(tr[tr[k].ch[x]].isend==0){
                        d[i+1][tr[k].ch[x]][0]=(d[i+1][tr[k].ch[x]][0]+d[i][k][0])%mod;
                    }
                }
            }
            for(int k=0;k<=id;k++){
                for(int x=0;x<n[i]-'0';x++){
                    if(tr[tr[k].ch[x]].isend==0){
                        d[i+1][tr[k].ch[x]][0]=(d[i+1][tr[k].ch[x]][0]+d[i][k][1])%mod;
                    }
                }
                int x=n[i]-'0';
                if(tr[tr[k].ch[x]].isend==0)d[i+1][tr[k].ch[x]][1]=(d[i+1][tr[k].ch[x]][1]+d[i][k][1])%mod;
            }
    }
    int ans=0;
    for(int i=0;i<=id;i++)
    ans=(ans+d[n.length()][i][0]+d[n.length()][i][1])%mod;
    cout<<sum<<" "<<ans-1<<endl;
}
int main(){
    int s;
    cin>>n>>s;
    for(int i=1;i<=s;i++){
        string x;
        cin>>x;
        if(x[0]=='0')z[++it]=x;
        insert(x);
    }
    get_fail();
    dp();
    return 0;
}
2024/9/25 23:54
加载中...