求湖北NOIP 1= 线+T1 MLE on #10 求调
  • 板块学术版
  • 楼主CNS_5t0_0r2
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/18 18:36
  • 上次更新2023/11/18 19:58:25
查看原帖
求湖北NOIP 1= 线+T1 MLE on #10 求调
999274
CNS_5t0_0r2楼主2023/11/18 18:36
#include<bits/stdc++.h> 
using namespace std;
const int N = 3001,M = 3001;
int n,m;
struct My_Str{
	char str2[M];
}s[N];
bool cmp(char c1,char c2){
	return c1 > c2;
}
struct node{
	int child[26];
	int Min;
}t[N * M];
int Min[N * M];
int tot;
void insert(char S[]){
	int u = 0;
	for(int i = 1;i <= m;i++){
		int tmp = S[i] - 'a';
		Min[u] = min(Min[u],tmp);
		if(!t[u].child[tmp])
			t[u].child[tmp] = ++tot;
		u = t[u].child[tmp];
	}
}
bool find(char S[]){
	int u = 0;
	for(register int i = 1;i <= m;i++){
		int tmp = S[i] - 'a';
		if(tmp > Min[u])
			return false;
		if(tmp < Min[u])
			return true;
		u = t[u].child[tmp];
	}
	return true;
}
char str[M],tmp_str[M];
int main(){
	//freopen("dict.in","r",stdin);
	//freopen("dict.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	memset(Min,0x3f,sizeof Min);
	cin >> n >> m;
	for(int i = 1;i <= n;i++){
		cin >> str + 1;
		for(int j = 1;j <= m;j++){
			s[i].str2[j] = str[j];
			tmp_str[j] = str[j];
		}
		sort(s[i].str2 + 1,s[i].str2 + m + 1);
		sort(tmp_str + 1,tmp_str + m + 1,cmp);
		insert(tmp_str);
	}
	if(n == 1){
		cout << 1;
		return 0;
	}
	for(int i = 1;i <= n;i++){
		if(find(s[i].str2))
			cout << 1;
		else
			cout << 0;
	}
	return 0;	
}
2023/11/18 18:36
加载中...