CF1391E Pairs of Pairs
大战一天构造题,CF 怎么那么多构造条件二选一/yun。
找到一棵 dfs 树,若深度 \(\ge \lceil \frac{n}{2}\rceil\) 则显然有满足条件的简单路径。
否则因为 dfs 树仅存在返祖边,对于同一深度的点两两配对必定合法,每个深度最多剩下一个点,则最多只有 \(\lceil\frac{n}{2}\rceil-1\) 个点未配对,满足要求。
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#define fin(x) freopen(#x".in","r",stdin)
#define fout(x) freopen(#x".out","w",stdout)
#define fr(x) fin(x),fout(x);
#define Fr(x,y) fin(x),fout(y)
#define INPUT(_1,_2,FILE,...) FILE
#define IO(...) INPUT(__VA_ARGS__,Fr,fr)(__VA_ARGS__)
using namespace std;
using namespace __gnu_pbds;
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define cfast ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define ll long long
#define ull unsigned long long
#define intz(x,y) memset((x),(y),sizeof((x)))
char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
#define tup(x) array<int,(x)>
inline ll read(){
ll x=0,f=1;char ch=nc();
while(ch<48||ch>57){if(ch=='-')f=-1;ch=nc();}
while(ch>=48&&ch<=57)x=x*10+ch-48,ch=nc();
return x*f;
}
//void write(int x){cout<<x<<' ';}
//void write(pii x){cout<<"P("<<x.fi<<','<<x.se<<")\n";}
//void write(vector<auto>x){for(auto i:x)write(i);cout<<'\n';}
//void write(auto *a,int l,int r){for(int i=l;i<=r;i++)write(a[i]);cout<<'\n';}
inline ll lowbit(ll x){return x&-x;}
inline int pcount(ll x){
for(int i=0,res=0;;res+=(x>>i)&1,i++)
if(i>60)return res;
}
//struct mt{
// ll v;
// mt(){v=0;}
// mt(int x){this->v=x;}
// inline mt operator+(mt x){return {(v+x.v)%mod};}
// inline mt operator-(mt x){return {(v+mod-x.v)%mod};}
// inline mt operator*(mt x){return {1ll*v*x.v%mod};}
//};
//inline void add(mt &x,mt y){x=x+y;}
//mt qp(mt x,int y){mt res(1);for(;y;x=x*x,y>>=1)if(y&1)res=res*x;return res;}
const int N=2e5+5,p=13131,mod=998244353;
int lst[N],nxt[N],a[N];char s[N];ull pw[N];
__gnu_pbds::gp_hash_table<ull,int>f;
void chg(int x,int y,bool fl){
ull tmp=0;
if(!fl)nxt[x]=y,lst[y]=x;
else nxt[x]=x,lst[y]=y;
for(int i=x,_=1;_<=50;++_,i=lst[i]){
tmp=tmp+a[i]*pw[_-1];ull h=tmp;
for(int j=y,__=50-_;__;--__,j=nxt[j]){
h=h*p+a[j],f[h]+=(!fl?1:-1);
if(nxt[j]==j)break;
}if(lst[i]==i)break;
}
}
inline void UesugiErii(){
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
lst[i]=nxt[i]=i,++f[a[i]];
while(m--){
int opt,x,y;cin>>opt;
if(opt==1)cin>>x>>y,chg(x,y,0);
else if(opt==2)cin>>x,chg(x,nxt[x],1);
else{
cin>>(s+1)>>x;
ull h=0;int len=strlen(s+1),ans=1;
for(int i=1;i<x;i++)
h=h*p+(s[i]-'0');
for(int i=x;i<=len;i++){
if(i>x)h=h-(s[i-x]-'0')*pw[x-1];
h=h*p+(s[i]-'0');
if(f.find(h)!=f.end())
ans=1ll*ans*f[h]%mod;
else ans=0;
}cout<<ans<<'\n';
}
}
}
signed main(){
//IO();
cfast;
int _=1;//cin>>_;
for(int i=pw[0]=1;i<=50;i++)pw[i]=pw[i-1]*p;
for(;_;_--)UesugiErii();
return 0;
}

浙公网安备 33010602011771号