题意:
有一个记录表,记录学生进或者出教室。但是现在表上的名字看不清了,只知道某两条记录是有联系的,这两条记录属于同一个学生(下面称为特殊学生),前者为进后者为出,且其间没有其它记录属于这个学生,问原表有多少种可能。
解法:
可以维护一个lef和inside,分别表示教室外的所有学生数量和教室内不是特殊学生的人数。进来时方案*lef,如果是不是特殊学生则++inside。出去时++lef,如果不是特殊学生则方案*inside,并--inside。
Time:10ms
Memory:520kB
Length:1196 B
#include <iostream>
#include <cstdio>
#include <queue>
#include <cmath>
#include <cstring>
#include <algorithm>
#define EPS 1e-3
#define MAXN 100010
#define INF 1000000007
#define MOD 1000000007
using namespace std;
char str[MAXN];
bool vi[MAXN];
int main()
{
//freopen("C:\\Documents and Settings\\k99\\My Documents\\input.txt","r",stdin);
int n,m,k,t,lef;
long long sum=1;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
scanf("%s",str);
memset(vi,0,sizeof(vi));
lef=0;
for(int i=0;i<m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
vi[a-1]=1,vi[b-1]=1;
}
sum=1;
for(int i=0;i<n;++i)
{
if(str[i]=='I')
{
sum=sum*k%MOD;
if(!vi[i])
++lef;
--k;
}
else
{
if(!vi[i])
{
sum=sum*lef%MOD;
--lef;
}
++k;
}
}
cout<<sum%MOD<<'\n';
}
return 0;
}