社区讨论

Hack

P1347[ECNA 2001] 排序参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo2xgqw6
此快照首次捕获于
2023/10/23 21:22
2 年前
此快照最后确认于
2023/10/23 21:22
2 年前
查看原帖
CPP
//Code by __dest__ruct__or__(uid=592238)
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
#define umap unordered_map
#define ll long long
#define pii pair<int,int>
#define pll pair<long long,long long>
namespace mySTL{
	inline int max(int a,int b){return a>b?a:b;}
	inline int min(int a,int b){return a<b?a:b;}
	inline ll max(ll a,ll b){return a>b?a:b;}
	inline ll min(ll a,ll b){return a<b?a:b;}
	inline int _abs(int a){return a<0?-a:a;}
	inline int read(){char c=getchar();int f=1,ans=0;
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
	return ans*f;}
	inline long long readll(){char c=getchar();long long f=1,ans=0;
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
	return ans*f;}
	inline void swap(int &a,int &b){a^=b,b^=a,a^=b;}
	inline void write(int x){if(x<0){putchar('-');x=-x;}
	if(x>=10){write(x/10);}putchar(x%10+'0');}
	inline void writell(long long x){if(x<0){putchar('-');x=-x;}
	if(x>=10){writell(x/10);}putchar(x%10+'0');}
	inline ll pw(ll a,ll b,ll p){if(b==0)return 1;
	if(b==1)return a%p;
	ll mid=pw(a,b/2,p)%p;
	if(b&1)return mid*mid%p*a%p;else{return mid*mid%p;}}
	inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
	inline int lcm(int a,int b){return a*b/gcd(a,b);}
}
using namespace mySTL;
struct edge{
	int u;
	int nxt;
}a[1001];
int in2[30],last[30],tot,n,m,in[30],x,y,out[30],res;
char aa,bb,ans[30];
bool vis[30];
queue<int>q;
inline void add(int x,int y){
	a[++tot].u=y;
	a[tot].nxt=last[x];
	last[x]=tot;
}
inline bool check(){
	for(int i=1;i<=n;i++){
		if(out[i]==0&&in[i]==0){
			return false;
		}
	}
	return true;
}
inline void sorted(int in[],int step){
	for(int i=1;i<=n;i++){
		if(in[i]==0){
			q.push(i);
		}
	}
	int cnt=0;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		ans[cnt++]=x-1+'A';
		int cnt2=0;
		for(int i=last[x];i!=-1;i=a[i].nxt){
			int v=a[i].u;
			in[v]--;
			if(in[v]==0){
				cnt2++;
				q.push(v);
			}
		}
		if(cnt2>=2){
			while(!q.empty()){
				q.pop();
			}
			return;
		}
	}
	if(cnt==n){
		printf("Sorted sequence determined after %d relations: ",step);
		for(int i=0;i<cnt;i++){
			putchar(ans[i]);
		}
		putchar('.');
		exit(0);
	}
}
inline void checkhuan(int in[],int step,int n2){
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			continue;
		}
		if(in[i]==0){
			q.push(i);
		}
	}
	int cnt=0;
	while(!q.empty()){
		int x=q.front();
		q.pop();
        cnt++;
		for(int i=last[x];i!=-1;i=a[i].nxt){
			int v=a[i].u;
			in[v]--;
			if(in[v]==0){
				q.push(v);
			}
		}
	}
	//cout<<cnt<<endl;
	if(cnt!=n2){
		printf("Inconsistency found after %d relations.",step);
		exit(0);
	}
}
int main(void){
	//freopen("data.txt","r",stdin);
	memset(last,-1,sizeof(last));
	n=read();
	m=read();
    /*if(n==4&&m==6){
    	printf("Inconsistency found after 6 relations.");
    	return 0;
	}
	if(n==10&&m==30){
		printf("Inconsistency found after 13 relations.");
		return 0;
	}*/
	for(int i=1;i<=m;i++){
		cin>>aa>>bb>>bb;
		x=aa-'A'+1;
		y=bb-'A'+1;
		add(x,y);
		if(!vis[x]){
			res++;
			vis[x]=true;
		}
		if(!vis[y]){
			res++;
			vis[y]=true;
		}
		in[y]++;
		out[x]++;
		memcpy(in2,in,sizeof(in));
		checkhuan(in2,i,res);
		memcpy(in2,in,sizeof(in));
		if(check()){
			sorted(in2,i);
		}
	}
	printf("Sorted sequence cannot be determined.");
	return 0;
}

这是我的代码,已经 AC 了。
但是不难构造出 hack 数据:
in:
CPP
3 2
A<B
C<B
out:
CPP
Sorted sequence cannot be determined.
my code:
CPP
Sorted sequence determined after 2 relations: ACB.
这里不想叉题解。
不知道我的程序哪里有问题,但是莫名就找到了这样一份 hack。

回复

3 条回复,欢迎继续交流。

正在加载回复...