#include<iostream>#include<string>#include<cstring>usingnamespace std;int n;int suma[2][100005], sumc[2][100005];
string a, b;intmain(void){int T;
cin >> T;while(T--){
cin >> n >> a >> b;bool flag =true;int b0 =0, b1 =0, i =0, j =0;for(; i < n;++i){while(b[j]=='b')++b1,++j;// 找到 t 中第一个不是 b 的,以匹配当前字符if(a[i]=='b')++b0;// 当前的 s 的这个字符是 b,跳过else{if(a[i]!= b[j]|| a[i]=='a'&& i > j || a[i]=='c'&& i < j){
flag =false;break;}++j;// 这个字符匹配过了}}while(j < n) b1 +=(b[j]=='b'),++j;if(b0 != b1) flag =false;
cout <<(flag ?"YES":"NO")<<'\n';}return0;}
#include<iostream>#include<cstdio>usingnamespace std;voidsolve(void){int n =0, w =0, a[2];
cin >> n;for(int i =1; i < n -2;++i)
cout << i <<' ', w ^= i;
cout <<(1<<28)<<' '<<(1<<29)<<' ';
w ^=(1<<28); w ^=(1<<29);
cout << w << endl;}intmain(void){int T;
cin >> T;while(T--)solve();return0;}
#include<iostream>#include<cstdio>usingnamespace std;typedeflonglong i64;int n, m;int a[100005];int T[400005][20], tag[400005];inlinevoidmaintain(int o){for(int i =0; i <20;++i)
T[o][i]= T[o <<1][i]+ T[o <<1|1][i];}voidbuild(int o,int l,int r){if(l == r){for(int i =0; i <20;++i)if((a[l]>> i)&1) T[o][i]=1;return;}int mid = l + r >>1;build(o <<1, l, mid);build(o <<1|1, mid +1, r);maintain(o);}inlinevoidpushdown(int o,int l,int r){if(!tag[o])return;int mid = l + r >>1, ls = o <<1, rs = o <<1|1;for(int i =0; i <20;++i)if((tag[o]>> i)&1){
T[ls][i]= mid - l +1- T[ls][i];
T[rs][i]= r - mid - T[rs][i];}
tag[ls]^= tag[o], tag[rs]^= tag[o];
tag[o]=0;}voidupdate(int o,int l,int r,int x,int y,int k){if(x <= l && r <= y){for(int i =0; i <20;++i)if((k >> i)&1) T[o][i]= r - l +1- T[o][i];
tag[o]^= k;return;}pushdown(o, l, r);int mid = l + r >>1;if(x <= mid)update(o <<1, l, mid, x, y, k);if(mid < y)update(o <<1|1, mid +1, r, x, y, k);maintain(o);}
i64 query(int o,int l,int r,int ql,int qr){if(ql <= l && r <= qr){
i64 res =0;for(int i =0; i <20;++i)
res +=1ll* T[o][i]*(1<< i);return res;}pushdown(o, l, r);int mid = l + r >>1;
i64 res =0;if(ql <= mid) res +=query(o <<1, l, mid, ql, qr);if(mid < qr) res +=query(o <<1|1, mid +1, r, ql, qr);return res;}intmain(void){scanf("%d",&n);for(int i =1; i <= n;++i)scanf("%d", a + i);build(1,1, n);scanf("%d",&m);while(m--){int op, l, r, x;scanf("%d%d%d",&op,&l,&r);if(op ==1)printf("%lld\n",query(1,1, n, l, r));else{scanf("%d",&x);update(1,1, n, l, r, x);}}return0;}
#include<cstdio>#include<cstring>int n, m, f[30];// f 记录 t 中每一个字母的位置 +1int l =1, cnt =1;// l 记录当前在 t 中的配对标号char s[200005], t[200005];intmain(void){scanf("%s%s", s +1, t +1);
n =strlen(s +1), m =strlen(t +1);for(int i =1; i <= n;++i){// 可以配对就配对if(s[i]== t[l])++l;if(s[i]== t[cnt]) f[s[i]-'a']=++cnt;// 这个字母在 t 中扫不到// 即使后面有,前面的也不够构成子序列if(f[s[i]-'a']==0)returnputs("No"),0;// 当 l > 这个字母最后一次的位置+1 时,说明当前的 l 根本不可能匹配上// 我们将它移到最后一次出现的位置,这样 t 中最后出现的位置之前都是可以与 s 的匹配的,这样只需要匹配 t 中的剩余内容,由于选的是子序列所以肯定是剩的越少越好,所以移到最后一次出现的位置。if(f[s[i]-'a']< l) l = f[s[i]-'a'];}if(l <= m)puts("No");// 没有配完elseputs("Yes");return0;}
[CF959D] Mahmoud and Ehab and another array construction task
#include<iostream>#include<cstdio>#include<set>usingnamespace std;constint N =2000000;int n;int a[100005];
set <int> s;voidkill(int x){for(int i = x; i <= N; i += x)if(s.count(i)) s.erase(i);}voiddel(int x){for(int i =2; i * i <= N;++i){if(x % i ==0){while(x % i ==0) x /= i;kill(i);}}if(x >1)kill(x);}intmain(void){scanf("%d",&n);for(int i =1; i <= n;++i)scanf("%d", a + i);for(int i =2; i <= N;++i) s.insert(i);bool flag =false;for(int i =1; i <= n;++i){auto it = flag ? s.begin(): s.lower_bound(a[i]);printf("%d ",*it);del(*it);}putchar('\n');return0;}
#include<iostream>#include<cstdio>#include<map>usingnamespace std;int n;int a[100005];voidsolve(void){
cin >> n;for(int i =1; i <= n;++i) cin >> a[i];int ans = n, S =0;
map <int,int> s;
s[0]=1;for(int i =1; i <= n;++i){
S ^= a[i];if(s.find(S)!= s.end()){--ans;
s.clear();
s[S =0]=1;}else s[S]=1;}
cout << ans <<'\n';}intmain(void){int T; cin >> T;while(T--)solve();return0;}