社区讨论

萌新球条(0pts)全wa

P7618[COCI 2011/2012 #2] FUNKCIJA参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlrh02wx
此快照首次捕获于
2026/02/18 11:26
昨天
此快照最后确认于
2026/02/18 23:20
18 小时前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
long long dp[27][100005],f[27][100005],sum[27][100005],n,vis[27],a[27][2],b[27],du[27],tt[27],ans=1,mod=1e9+7;
vector<int> e[27];
void dfs(int x,int fa){
    bool t=0;
    for (int i=1;i<=100000;i++){
        f[x][i]=1;
    }
    for (int y:e[x]){
        t=1;
        dfs(y,x);
    }
    for (int i=1;i<=100000;i++){
        sum[x][i]=(sum[x][i-1]+f[x][i])%mod;
    }
    tt[fa]=1;
    for (int i=1;i<=100000;i++){
        long long start=0,end=0;
        if (b[x]==1){
            start=i;
            end=a[x][0];
        }
        else if (b[x]==2){
            start=a[x][0];
            end=i;
        }
        else{
            start=a[x][0];
            end=a[x][1];
        }
        if (start<=end){
            dp[x][i]=(sum[x][end]-sum[x][start-1]+mod)%mod;
            f[fa][i]=(f[fa][i]*dp[x][i])%mod;
        }
        else{
            f[fa][i]=0;
        }
    }
    vis[x]=1;
    return ;
}
int main(){
    cin>>n;
    string s;
    getline(cin,s);
    for (int i=1;i<=n;i++){
        string s;
        getline(cin,s);
        s=" "+s;
        int pos=1;
        if (s[pos]>='a' && s[pos]<='z'){
            b[i]=1;
            e[s[pos]-'a'+1].push_back(i);
            pos=3;
            du[i]++;
            for (int j=pos;j<s.size();j++){
                a[i][0]=a[i][0]*10+(s[j]^48);
            }
        }
        else{
            for (;s[pos]!=' ';pos++){
                a[i][0]=a[i][0]*10+(s[pos]^48);
            }
            pos++;
            if (s[pos]>='a' && s[pos]<='z'){
                e[s[pos]-'a'+1].push_back(i);
                du[i]++;
                b[i]=2;
            }
            else{
                for (;pos<s.size();pos++){
                    a[i][1]=a[i][1]*10+(s[pos]^48);
                }
            }
        }
    }
    for (int i=1;i<=n;i++){
        if (!du[i] && !vis[i]){
            dfs(i,0);
            ans=(ans*dp[i][1])%mod;
        }
    }
    printf("%lld",ans);
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...