提交时间:2025-10-21 16:13:13

运行 ID: 38717

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef unsigned long long ll; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } const ll inf=9e18,mod[2]={inf+41,inf+53}; int n,a[61][2]; struct{ int o; ll t[122][122],_[122][122]; void clear(){memset(t,0,sizeof(t)),memset(_,0,sizeof(_));} ll add(ll a,ll b){if((a+=b)>=mod[o])a-=mod[o];return a;} ll sub(ll a,ll b){if(a<b)return a+mod[o]-b;return a-b;} ll mul(ll a,ll b){return (__int128)a*b%mod[o];} ll qp(ll a){ ll b=mod[o]-2; ll res=1; while(b){ if(b&1)res=mul(res,a); a=mul(a,a);b>>=1; }return res; } void init_gauss(int n){ up(i,1,n)_[i][i]=1; up(i,1,n){ int j=i; while(!t[j][i])j++; up(k,1,n)swap(_[i][k],_[j][k]); up(k,1,n)swap(t[i][k],t[j][k]); ll iv=qp(t[i][i]); up(j,i+1,n){ ll x=mul(t[j][i],iv); up(k,1,n)t[j][k]=sub(t[j][k],mul(x,t[i][k])); up(k,1,n)_[j][k]=sub(_[j][k],mul(x,_[i][k])); } } down(i,n,1){ up(j,i+1,n)up(k,1,n)_[i][k]=sub(_[i][k],mul(t[i][j],_[j][k])); ll x=qp(t[i][i]);up(j,1,n)_[i][j]=mul(_[i][j],x); } } vector<ll>qr(int n,vector<ll>a){ vector<ll>res(n+1,0); up(i,1,n){ up(j,1,n)res[i]=add(res[i],mul(a[j],_[i][j])); } return res; } }A,B; void upd(int x,int y,int w){ A.t[x][y]=A.add(A.t[x][y],(w+(long long)mod[0])%mod[0]); B.t[x][y]=B.add(B.t[x][y],(w+(long long)mod[1])%mod[1]); } ll cnt[61]; void slv(){ n=read(); up(i,1,n-1)up(j,0,1)a[i][j]=read(); A.o=0,B.o=1; int q=read(); A.clear(),B.clear(); up(i,1,n-1)upd(i,i,-1),upd(i,i+n-1,1); up(i,1,n-1)upd(i+n-1,i,1),upd(i+n-1,i+n-1,1); up(i,1,n-1)upd(a[i][0]+n-1,i,-1),upd(a[i][1]+n-1,i+n-1,-1); A.init_gauss(2*(n-1)),B.init_gauss(2*(n-1)); while(q--){ int u=read();string s;cin>>s;s=" "+s; vector<ll>_={0},__={0}; up(i,1,n-1)_.p_b(s[i]=='R'),__.p_b(s[i]=='R'); up(i,1,n-1){int ___=(i==1)-(i==u);_.p_b((___+mod[0])%mod[0]),__.p_b((___+mod[1])%mod[1]);} vector<ll>a=A.qr(2*(n-1),_),b=B.qr(2*(n-1),__); if(a!=b){puts("-1");continue;} up(i,1,n-1)cnt[i]=a[i]+a[i+n-1]; auto bfs=[&](int p){ vector<bool>vis(n+1,0); while(!vis[p]){ vis[p]=1,p=::a[p][cnt[p]&1]; if(u==p)return 1; } return 0; }; bool fail=0; up(i,1,n-1)if(cnt[i])if(!bfs(i))fail=1; if(fail){puts("-1");continue;} ll res=0;up(i,1,n-1)res+=cnt[i]; printf("%lld\n",res); } } int main(){ //freopen("feng.in","r",stdin),freopen("feng.out","w",stdout); slv(); return 0; }