1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include<bits/stdc++.h> #define int long long #define ull unsigned long long #define maxn 200005 #define put() putchar('\n') #define Tp template<typename Ty> #define Ts template<typename Ty,typename... Ar> using namespace std; void read(int &x){ int f=1;x=0;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} x*=f; } namespace Debug{ Tp void _debug(char* f,Ty t){cerr<<f<<'='<<t<<endl;} Ts void _debug(char* f,Ty x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);} Tp ostream& operator<<(ostream& os,vector<Ty>& V){os<<"[";for(auto& vv:V) os<<vv<<",";os<<"]";return os;} #define gdb(...) _debug((char*)#__VA_ARGS__,__VA_ARGS__) }using namespace Debug; #define fi first #define se second #define mk make_pair const int mod=998244353; int power(int x,int y=mod-2) { int sum=1; while (y) { if (y&1) sum=sum*x%mod; x=x*x%mod;y>>=1; } return sum; } int fa[maxn]; int a[maxn],t[maxn]; int s[maxn],n,l,r,tot,c[maxn],vis[maxn]; const int base=2e5; int getfa(int x) {return x==fa[x]?x:fa[x]=getfa(fa[x]);} signed main(void){ int i,nums=0,cnt=0; read(n); for (i=1;i<=n;i++) read(a[i]),t[a[i]]++,nums+=(t[a[i]]==1); for (i=1;i<=n;i++) { if (l==r) tot++,fa[tot]=tot; c[i]=tot; if (l>r&&s[r+1]==a[i]) vis[a[i]]=0,r++; else if (vis[a[i]]) return printf("%lld",power(2,nums-1)),0; else s[++l]=a[i],vis[a[i]]=1; } if (l!=r) return printf("%lld",power(2,nums-1)),0; for (i=1;i<=n;i++) t[a[i]]=0; for (i=1;i<=n;i++) { int las=t[a[i]]; if (las&&getfa(c[las])!=getfa(c[i])) fa[getfa(c[las])]=getfa(c[i]); t[a[i]]=i; } for (i=1;i<=tot;i++) cnt+=(i==getfa(i)); printf("%lld",(power(2,nums-1)-power(2,cnt-1)+mod)%mod); return 0; }
|