树形dp,感觉思路很对,三个样例都过了,求神犇帮调。
#include<bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
int n,f[27][100005],sum[27][100005],cnt[37],ans=1;
vector<int>v[27];
const int mod=1000000007;
struct nam{
string x,y;
int a,b;
}a[38];
void dfs(int k){
for(int i=1;i<=100000;++i)f[k][i]=1;
for(auto i:v[k]){
dfs(i);
for(int j=1;j<=100000;++j){
if(a[i].a==0){
if(j<=a[i].b)f[k][j]=f[k][j]*(sum[i][a[i].b]-sum[i][j-1]+mod+mod)%mod;
}else{
if(a[i].b==0){
if(a[i].a<=j)f[k][j]=f[k][j]*(sum[i][j]-sum[i][a[i].a-1]+mod+mod)%mod;
}else{
f[k][j]=f[k][j]*(sum[i][a[i].b]-sum[i][a[i].a-1]+mod+mod)%mod;
}
}
}
}
for(int i=1;i<=100000;++i)sum[k][i]=(sum[k][i-1]+f[k][i]+mod)%mod;
return;
}
main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i].x>>a[i].y;
if('a'<=a[i].x[0]&&a[i].x[0]<='z')v[a[i].x[0]-'a'+1].emplace_back(i),++cnt[i];
else for(auto j:a[i].x)a[i].a=a[i].a*10+j-'0';
if('a'<=a[i].y[0]&&a[i].y[0]<='z')v[a[i].y[0]-'a'+1].emplace_back(i),++cnt[i];
else for(auto j:a[i].y)a[i].b=a[i].b*10+j-'0';
}
for(int i=1;i<=n;++i)if(cnt[i]==0)dfs(i),(ans*=(sum[i][a[i].b]-sum[i][a[i].a-1]+mod+mod))%=mod;
cout<<ans;
return 0;
}