问一下大佬们,这样的DAG Topo转移为什么有问题啊
查看原帖
问一下大佬们,这样的DAG Topo转移为什么有问题啊
38171
DeNeRATe楼主2020/8/23 21:37
//SPOJ SUBLEX - Lexicographical Substring Search
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>

#define LL long long
#define Lowbit(X) (X&(-X))
#define Lson (X<<1)
#define Rson (X<<1|1)
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(LL i=A;i<=B;i++)
#define BOR(i,A,B) for(LL i=A;i>=B;i--)
#define FOR_SIDE(i,A) for(LL i=Head[A];i;i=Next[i])
#define INF 0x7fffffff
using namespace std;
const int MAXN=1e5+10;

int Size,u,v,w,DP[MAXN<<1],Last,Test,Temp;
struct Node {
    int Link,Ch[30];
    int Len;
}State[MAXN<<1];
char Num[MAXN];
int Next[MAXN<<2],End[MAXN<<2],Side,Head[MAXN<<1],Val[MAXN<<2];
int RNext[MAXN<<2],REnd[MAXN<<2],RSide,RHead[MAXN<<1];
int CD[MAXN<<1];
queue<int>Mine;

inline void File() {
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
}

inline void Update(int New) {
    int Cur=++Size;
    State[Cur].Len=State[Last].Len+1;
    int Loc=Last;
    while(Loc!=-1 && !State[Loc].Ch[New]) {
        State[Loc].Ch[New]=Cur;
        Loc=State[Loc].Link;
    }
    if(Loc==-1) State[Cur].Link=0;
    else {
        int To=State[Loc].Ch[New];
        if(State[To].Len==State[Loc].Len+1) { State[Cur].Link=To; }
        else {
            int Clone=++Size;
            State[Clone].Len=State[Loc].Len+1;
            FOR(i,1,26) State[Clone].Ch[i]=State[To].Ch[i];
            State[Clone].Link=State[To].Link;
            while(Loc!=-1 && State[Loc].Ch[New]==To) {
                State[Loc].Ch[New]=Clone;
                Loc=State[Loc].Link;
            }
            State[To].Link=State[Cur].Link=Clone;
        }
    }
    Last=Cur;
}

inline void Add_Edge(int From,int To,int Res) {
    Next[++Side]=Head[From];
    Head[From]=Side;
    End[Side]=To;
    Val[Side]=Res;
    CD[From]++;
    RNext[++RSide]=RHead[To];
    RHead[To]=RSide;
    REnd[RSide]=From;
}

inline void Topo() { 
	FOR(i,1,Size) if(!CD[i]) Mine.push(i); 
	while(!Mine.empty()) {
		int New=Mine.front();
		DP[New]+=1;
		Mine.pop();
		for(int i=RHead[New];i;i=RNext[i]) {
			DP[REnd[i]]+=DP[New];
			if(!(--CD[REnd[i]])) Mine.push(REnd[i]);
		}
	}
}
inline void Query(int New,int Rank) {
    if(!Rank) { return; }
    FOR_SIDE(i,New) {
        if(DP[End[i]]<Rank) Rank-=DP[End[i]];
        else {
            printf("%c",(char)(Val[i]+'a'-1));
            Query(End[i],Rank-1);
            return;
        }
    }
}

inline void Get(int Rank) {
    if(Rank>=DP[0]) printf("-1\n");
    else Query(0,Rank);
}

inline void DFS(int New) {
	BOR(i,26,1) {
		if(!State[New].Ch[i]) continue;
		Add_Edge(New,State[New].Ch[i],i);
		DFS(State[New].Ch[i]);
	}
}

int main() {
    //File();
    scanf("%s",Num+1); Temp=strlen(Num+1);
    State[0].Link=-1;
    FOR(i,1,Temp) { Update(Num[i]-'a'+1); } 
    DFS(0);
    Topo();
    scanf("%d",&Test);
    while(Test--) {
        scanf("%d",&u);
		Get(u);
		printf("\n");
    }
    //fclose(stdin); fclose(stdout);
    system("pause");
    return 0;
}
2020/8/23 21:37
加载中...