2018-ACetic_ACid/AugTrain-03/B
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
#include <bits/stdc++.h>
#ifdef LOCAL
#define debug 1
#else
#define debug 0
#endif
typedef long long ll;
using namespace std;
#define N 5100
const int mod=1e9+7;
int n;
char s[N];
int f[N][N],g[N][N],jc[N];
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
if(n==1)
{
printf("1");
return 0;
}
jc[0]=1;
for(int i=1;i<=n;i++) jc[i]=1ll*jc[i-1]*i%mod;
f[0][0]=1;
g[n+1][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=i;j++)
{
if(s[i]=='>')
{
(f[i][j]+=1ll*f[i-1][j]*j%mod)%=mod;
if(j) (f[i][j]+=f[i-1][j-1])%=mod;
}
else
{
(f[i][j]+=1ll*f[i-1][j+1]*j%mod*(j+1)%mod)%=mod;
(f[i][j]+=1ll*f[i-1][j]*j%mod)%=mod;
}
}
f[i][0]=0;
}
for(int i=n;i>=1;i--)
{
for(int j=0;j<=n-i+1;j++)
{
if(s[i]=='<')
{
(g[i][j]+=1ll*g[i+1][j]*j%mod)%=mod;
if(j) (g[i][j]+=g[i+1][j-1])%=mod;
}
else
{
(g[i][j]+=1ll*g[i+1][j+1]*j%mod*(j+1)%mod)%=mod;
(g[i][j]+=1ll*g[i+1][j]*j%mod)%=mod;
}
}
g[i][0]=0;
}
/* for(int i=1;i<=n;i++,cerr<<endl)
for(int j=0;j<=n;j++)
{
cerr<<f[i][j]<<" ";
}
cerr<<endl;
for(int i=1;i<=n;i++,cerr<<endl)
for(int j=0;j<=n;j++)
{
cerr<<g[i][j]<<" ";
}*/
for(int i=1;i<=n;i++)
{
int ans=0;
if(i==1) ans=g[2][1];
else if(i==n) ans=f[n-1][1];
else
{
for(int j=1;j<i;j++)
{
(ans+=2ll*f[i-1][j]%mod*g[i+1][j]%mod*jc[j]%mod*jc[j]%mod)%=mod;
(ans+=1ll*f[i-1][j]*g[i+1][j+1]%mod*jc[j]%mod*jc[j+1]%mod)%=mod;
}
for(int j=1;j<n-i+1;j++)
{
(ans+=1ll*f[i-1][j+1]*g[i+1][j]%mod*jc[j]%mod*jc[j+1]%mod)%=mod;
}
}
if(i!=1) printf(" ");
printf("%d",ans);
}
return 0;
}
}}}
#include <bits/stdc++.h>
#ifdef LOCAL
#define debug 1
#else
#define debug 0
#endif
typedef long long ll;
using namespace std;
#define N 5100
const int mod=1e9+7;
int n;
char s[N];
int f[N][N],g[N][N],jc[N];
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
if(n==1)
{
printf("1");
return 0;
}
jc[0]=1;
for(int i=1;i<=n;i++) jc[i]=1ll*jc[i-1]*i%mod;
f[0][0]=1;
g[n+1][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=i;j++)
{
if(s[i]=='>')
{
(f[i][j]+=1ll*f[i-1][j]*j%mod)%=mod;
if(j) (f[i][j]+=f[i-1][j-1])%=mod;
}
else
{
(f[i][j]+=1ll*f[i-1][j+1]*j%mod*(j+1)%mod)%=mod;
(f[i][j]+=1ll*f[i-1][j]*j%mod)%=mod;
}
}
f[i][0]=0;
}
for(int i=n;i>=1;i--)
{
for(int j=0;j<=n-i+1;j++)
{
if(s[i]=='<')
{
(g[i][j]+=1ll*g[i+1][j]*j%mod)%=mod;
if(j) (g[i][j]+=g[i+1][j-1])%=mod;
}
else
{
(g[i][j]+=1ll*g[i+1][j+1]*j%mod*(j+1)%mod)%=mod;
(g[i][j]+=1ll*g[i+1][j]*j%mod)%=mod;
}
}
g[i][0]=0;
}
/* for(int i=1;i<=n;i++,cerr<<endl)
for(int j=0;j<=n;j++)
{
cerr<<f[i][j]<<" ";
}
cerr<<endl;
for(int i=1;i<=n;i++,cerr<<endl)
for(int j=0;j<=n;j++)
{
cerr<<g[i][j]<<" ";
}*/
for(int i=1;i<=n;i++)
{
int ans=0;
if(i==1) ans=g[2][1];
else if(i==n) ans=f[n-1][1];
else
{
for(int j=1;j<i;j++)
{
(ans+=2ll*f[i-1][j]%mod*g[i+1][j]%mod*jc[j]%mod*jc[j]%mod)%=mod;
(ans+=1ll*f[i-1][j]*g[i+1][j+1]%mod*jc[j]%mod*jc[j+1]%mod)%=mod;
}
for(int j=1;j<n-i+1;j++)
{
(ans+=1ll*f[i-1][j+1]*g[i+1][j]%mod*jc[j]%mod*jc[j+1]%mod)%=mod;
}
}
if(i!=1) printf(" ");
printf("%d",ans);
}
return 0;
}