描述
很久很久以前,有个叫123的国家,这个国家的国王很喜欢颁布各种法令,并把这些法令记录在一部《123法典》中。最近这部法典终于被发掘了出来,专家们经过研究发现法典中的法令是按颁布的时间顺序记载的只有两种格式:
同时,如果一条法令没有被其他有效的法令宣布无效,那么它就是有效的。现在他们想知道那些法令是有效的,你能帮助他们吗?
输入
第一行一个数N,表示法典中法令的数目。
接下来N行每行一个字符串,表示一条法令,第i行的法令编号为i。法令按颁布时间顺序给出。
输出
第一行一个数K表示有效法令的数目。
第二行K个数表示有效法令的编号,两个数中间用一个空格隔开。
输入样例 1
5 declare cancel 1 declare cancel 2 cancel 3
输出样例 1
3 1 4 5
输入样例 2
3 declare declare declare
输出样例 2
3 1 2 3
提示
【数据规模】
对于全部的数据,N <= 100000。
WA一半 始终没找到为什么错
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define pb push_back #define fi first #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) /////////////////////////////////// #define inf 0x3f3f3f3f #define N 1000000+50 int in[N]; int vis[N]; vector<int>edge[N]; vector<int>ans; int main() { int n; RI(n); string str; rep(i,1,n) { cin>>str; if(str=="cancel") { int x; RI(x); in[x]+=1; edge[i].pb(x); } } queue<int>q; rep(i,1,n) if(in[i]==0) q.push(i); ans.clear(); while(!q.empty()) { int u=q.front();q.pop(); if(!vis[u]) ans.pb(u); if(edge[u].size()) { int x=edge[u][0]; vis[x]=1; if(edge[x].size() ) { int t=edge[x][0]; in[t]--; if(in[t]==0&&!vis[t]) q.push(t); } } } if(ans.size()) sort(ans.begin(),ans.end()); printf("%d ",ans.size()); if(ans.size()) rep(i,0,ans.size()-1) { if(i!=0)printf(" "); printf("%d",ans[i]); } return 0; }