T1 太简单直接 sort 排序和 reverse 反过来就可以了。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define For(i,l,r) for(int i=l;i<=r;i++)
int n,m;
const int N=3e3+10;
char w[N][N];
char mn[N][N];
char mx[N][N];
char a[N];
int cnt;
bool chk(char s[],char s2[]){For(i,1,m){if(s[i]<s2[i])return 1;if(s[i]>s2[i])return 0;}return 1;
}
int main(){
// freopen("dict4.in","r",stdin);
// freopen("dict4.out","w",stdout);ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n>>m;For(i,1,n)cin>>(w[i]+1);For(i,1,n){cnt=0;For(j,1,m){a[++cnt]=w[i][j];}sort(a+1,a+cnt+1);For(j,1,cnt)mn[i][j]=a[j];reverse(a+1,a+cnt+1);For(j,1,cnt)mx[i][j]=a[j];}For(i,1,n){bool f=0;For(j,1,n){if(j==i)continue;if(chk(mx[j],mn[i])){f=1;cout<<0;break;}}if(!f)cout<<1;}return 0;
}
T2 思路很水但是不算很好写。
分类讨论。找最后一次赋值的地方。
-
一个点前面操作没出现赋值
- 奇数次取反 $\rightarrow \ U $
- 否则不是 \(U\)。
-
前面出现 \(v\) 类赋值。
- 取反后与原来不等 $\rightarrow \ U $
- 否则不是 \(U\)。
-
前面出现 \(x_j\) 类赋值。
- 建图,\(x_j \rightarrow x_i\)。因为最后一次赋值只有一个数,所以每个点只有一个父亲。
最终可能连成一棵树,当然也有可能形成环。边权定为赋值后非运算次数的奇偶性。
按照异或来算路上权值。
- 建图,\(x_j \rightarrow x_i\)。因为最后一次赋值只有一个数,所以每个点只有一个父亲。
考虑第三种情况什么时候会出现 \(U\)。
手玩后发现出现奇数个 \(1\) 参与异或时,会使得环上的每个点走完一圈推出了与自己相反的结论。这时环上点全是 \(U\) 才行。