T1

注意到,单独一个字符是最优的。所以我们对每一种字符进行前缀和优化,然后去枚举,到底哪个最多

点击查看代码
#include
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define endl '\n'
using namespace std;
const int maxn=1e6+5;
int cnt[maxn][30];
signed main()
{freopen("sam.in","r",stdin);freopen("sam.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n,q;cin>>n>>q;string s;cin>>s,s=' '+s;for(int i=1;i<=n;i++){for(int j=1;j<=26;j++) cnt[i][j]=cnt[i-1][j];cnt[i][s[i]-'a'+1]++;}while(q--){int x,y,ans=0;cin>>x>>y;for(int i=1;i<=26;i++) ans=max(ans,cnt[y][i]-cnt[x-1][i]);cout<

T2

考虑按照排列1到n的顺序去加入新的字符。

那么最新加的字符一定是最大的,那么它的最长上升子序列就是它前面的所有的字符的上升值序列的最大值加1。

用树状数组或者线段树维护即可。

点击查看代码
#include
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define endl '\n'
using namespace std;
const int maxn=1e6+5;
int a[maxn],bit[maxn],id[maxn],n;
int lb(int x)
{return x&-x;
}
void update(int x,int y)
{while(x<=n) bit[x]=max(bit[x],y),x+=lb(x);
}
int query(int x,int ans=0)
{while(x) ans=max(ans,bit[x]),x-=lb(x);return ans;
}
signed main()
{freopen("lis.in","r",stdin); freopen("lis.out","w",stdout); ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin>>n;for(int i=1;i<=n;i++) cin>>a[i],id[a[i]]=i;for(int t=1;t<=n;t++){int i=id[t],x=query(i)+1;
//		cout<

T3

对于狼人,你啥都不知道

因此,只能去考虑寻找村民的序列

那么每个人的话就可以转换成左边有多少个村民和右边有多少个村民

显然,所有的话都可以转换成左边有多少个村民

这样就可以dp了

再有线段数和矩阵优化优化即可。

代码上建议统一每一个的起始下标以及终止下标不然的话很容易出现问题。

点击查看代码
#include
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define endl '\n'
using namespace std;
const int maxn=500005;
const int mod=998244353;
struct Mat
{unsigned a00,a01,a10,a11;
};
inline Mat mul(const Mat &X,const Mat &Y)
{Mat Z;Z.a00=(unsigned)(((unsigned long long)X.a00*Y.a00+(unsigned long long)X.a01*Y.a10)%mod);Z.a01=(unsigned)(((unsigned long long)X.a00*Y.a01+(unsigned long long)X.a01*Y.a11)%mod);Z.a10=(unsigned)(((unsigned long long)X.a10*Y.a00+(unsigned long long)X.a11*Y.a10)%mod);Z.a11=(unsigned)(((unsigned long long)X.a10*Y.a01+(unsigned long long)X.a11*Y.a11)%mod);return Z;
}
int n;
string D;
int B[maxn];
Mat tr[maxn*4];
int typ_[2][maxn];
int lab_[2][maxn];
int val_[2][maxn];
int evh_act[maxn], evh_deact[maxn];
int evn_act[maxn*2], evn_deact[maxn*2];
int evs_act[maxn*2], evs_deact[maxn*2];
inline void setleaf(int o,int p)
{tr[o].a00=val_[0][p]; tr[o].a01=val_[1][p];tr[o].a10=1; tr[o].a11=0;
}
void build(int o,int l,int r)
{if(l==r){setleaf(o,l);return;}int mid=(l+r)>>1;build(o<<1,l,mid); build(o<<1|1,mid+1,r);tr[o]=mul(tr[o<<1|1],tr[o<<1]);
}
void update(int o,int l,int r,int x)
{if(l==r)	{setleaf(o,x);return;}int mid=(l+r)>>1;if(x<=mid) update(o<<1,l,mid,x); else update(o<<1|1,mid+1,r,x);tr[o]=mul(tr[o<<1|1],tr[o<<1]);
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);freopen("wolf.in","r",stdin);freopen("wolf.out","w",stdout);int _;cin>>_; while(_--){cin>>n>>D;D=' '+D; for(int i=1;i<=n;i++) cin>>B[i];int Q=(n+1)/2;if(n==2){int ans=0;for(int q=0;q<=1;q++){int dp1=(D[1]=='L')?((B[1]==0)?1:0):((q==B[1])?1:0);int h2=(D[2]=='L')?((B[2]==1)?1:0):((q==B[2]+1)?1:0);int c12=(D[1]==D[2])?((B[2]==B[1])?1:0):((q==B[1]+B[2])?1:0);int dp2=(h2+c12*dp1)%mod;int r=0;for(int p=1;p<=2;p++){int phi=(D[p]=='L')?B[p]-p:q-B[p]-p;if(phi==q-n) r+= (p==1?dp1:dp2);}ans=(ans+r)%mod;}cout<=0&&L<=Q) { ec++; evn_act[ec]=evh_act[L]; evh_act[L]=ec; evs_act[ec]=id; }if(L+1<=Q) { ec++; evn_deact[ec]=evh_deact[L+1]; evh_deact[L+1]=ec; evs_deact[ec]=id; }}}for(int p=3;p<=n;p++) for(int t=0;t<=1;t++) val_[t][p]=(typ_[t][p]==1)?1:0;build(1,3,n);int ans=0;for(int q=0;q<=Q;q++){if(q>=1){for(int e=evh_deact[q];e!=-1;e=evn_deact[e]){int id=evs_deact[e],p=id>>1,t=id&1;val_[t][p]=0;update(1,3,n,p);}}for(int e=evh_act[q];e!=-1;e=evn_act[e]){int id=evs_act[e],p=id>>1,t=id&1;val_[t][p]=1;update(1,3,n,p);}int dp1=(D[1]=='L')?((B[1]==0)?1:0):((q==B[1])?1:0);int h2=(D[2]=='L')?((B[2]==1)?1:0):((q==B[2]+1)?1:0);int c12=(D[1]==D[2])?((B[2]==B[1])?1:0):((q==B[1]+B[2])?1:0);int dp2=(h2+c12*dp1)%mod;const Mat &P=tr[1];int dpn=((unsigned long long)P.a00*dp2+(unsigned long long)P.a01*dp1)%mod;int dpnm1=((unsigned long long)P.a10*dp2+(unsigned long long)P.a11*dp1)%mod;int add=0;int pn=n,pn1=n-1;{int tau=(D[pn]=='L')?((q==n-pn+B[pn])?1:0):((B[pn]==n-pn)?1:0);add+=tau*dpn;}{int tau=(D[pn1]=='L')?((q==n-pn1+B[pn1])?1:0):((B[pn1]==n-pn1)?1:0);add+=tau*dpnm1;}ans=(ans+add)%mod;}cout<