求助大佬!为什么是Runtime Error(Orz)
查看原帖
求助大佬!为什么是Runtime Error(Orz)
38171
DeNeRATe楼主2020/7/25 19:26
//UVA1227
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>

#define LL long long
#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 0x3f3f3f3f
using namespace std;
const LL MAXN=1e7+10;

char Num[MAXN],Temp[8][MAXN];
LL Len,Str[8],Total,Test;
LL Sa[MAXN],Rank[MAXN],Height[MAXN],Bar[122],Sec[MAXN];
LL Next[MAXN],Col[MAXN];
LL Tree[MAXN<<2],Ans=-INF;
LL Last[130];

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

inline void Clean() {
    Len=0; Ans=-INF;
    Cl(Tree,0x3f); Cl(Sa,0); Cl(Rank,0); Cl(Height,0); Cl(Next,0);
    Cl(Col,0); Cl(Last,0); Cl(Bar,0); Cl(Str,0);
}

inline void Get_Sa() {
	LL Limit=122;
    FOR(i,1,Len) Bar[Rank[i]=Num[i]]++;
    FOR(i,2,Limit) Bar[i]+=Bar[i-1];
    BOR(i,Len,1) Sa[Bar[Rank[i]]--]=i;
    for(LL k=1;k<=Len;k<<=1) {
        LL Cnt=0; Cl(Bar,0);
        FOR(i,Len-k+1,Len) Sec[++Cnt]=i;
        FOR(i,1,Len) if(Sa[i]>k) Sec[++Cnt]=Sa[i]-k;
        FOR(i,1,Len) ++Bar[Rank[i]];
        FOR(i,2,Limit) Bar[i]+=Bar[i-1];
        BOR(i,Len,1) Sa[Bar[Rank[Sec[i]]]--]=Sec[i];
        swap(Rank,Sec);
        Rank[Sa[1]]=1; Cnt=1;
        FOR(i,2,Len) Rank[Sa[i]]=(Sec[Sa[i]]==Sec[Sa[i-1]] && Sec[Sa[i]+k]==Sec[Sa[i-1]+k]) ? Cnt : ++Cnt;
        if(Cnt==Len) break;
        Limit=Cnt;
    }
}

inline void Get_Height() {
    LL Loc=0;
    FOR(i,1,Len) {
        if(Loc) Loc--;
        while(Num[i+Loc]==Num[Sa[Rank[i]-1]+Loc]) Loc++;
        Height[Rank[i]]=Loc;
    }
}

inline void Init() {
    BOR(i,Len,1) {
        if(Num[Sa[i]]>=(char)100)  continue;
        if(Last[Col[Sa[i]]]) Next[i]=Last[Col[Sa[i]]],Last[Col[Sa[i]]]=i;
        else Last[Col[Sa[i]]]=i;
    }
}

inline void Push_up(LL X) {
    Tree[X]=min(Tree[Lson],Tree[Rson]);
}

inline void Build(LL L,LL R,LL X) {
    if(L==R) { Tree[X]=Height[L]; return ; }
    LL Mid=(L+R)>>1;
    Build(L,Mid,Lson); Build(Mid+1,R,Rson);
    Push_up(X);
}

inline LL Get(LL L,LL R,LL From,LL To,LL X) {
    if(L>=From && R<=To) { return Tree[X]; }
    LL Mid=(L+R)>>1,Res=INF;
    if(From<=Mid) Res=min(Res,Get(L,Mid,From,To,Lson));
    if(To>Mid) Res=min(Res,Get(Mid+1,R,From,To,Rson));
    return Res;
}

inline void Solve() {
    LL Loc[10],Cnt=0,Rmax=0,Lmin=0;
    Cl(Loc,0);
    FOR(i,1,Len) {
    	if(Num[Sa[i]]>=(char)100) continue;
        if(!Loc[Col[Sa[i]]]) Loc[Col[Sa[i]]]=i,Cnt++;
        else continue;
        if(Cnt==Total) break;
    }
    while(true) {
        LL Temp;
        bool Jud=false;
        Lmin=INF; Rmax=-INF;
        FOR(i,1,Total) { if(Loc[i]<Lmin) Lmin=Loc[i],Temp=i; }
        FOR(i,1,Total) { if(Loc[i]>Rmax) Rmax=Loc[i]; }
        Loc[Temp]=Next[Loc[Temp]];
        Ans=max(Ans,Get(1,Len,Lmin+1,Rmax,1));
        FOR(i,1,Total) if(Loc[i]==0) { Jud=true; break; }
        if(Jud) break;
    }
}

int main() {
    //File();
    scanf("%lld",&Test);
    while(Test--) {
        scanf("%lld",&Total);
        Clean();
        FOR(i,1,Total) {
            scanf("%s",Temp[i]+1);
            Str[i]=strlen(Temp[i]+1);
			if(i==1) Num[Len]=(char)(100+i);
			else Num[++Len]=(char)(100+i);
			FOR(j,Len+1,Len+Str[i]) Num[j]=Temp[i][j-Len];
            Len+=Str[i];
            FOR(j,Len-Str[i]+1,Len) Col[j]=i;
        }
        Get_Sa(); Get_Height(); Init();
        Build(1,Len,1); 
		Solve();
        printf("%lld\n",Ans);
    }
    //fclose(stdin); fclose(stdout);
    system("pause");
    return 0;
}
/*
2
2
ACGGGCGTCGTCCCCGTCGTCGTATC
CTCGTCGTCCCCGTCGTCGTGTC
3
ACGACGGCTGCGGTAACCC
TTACGGCTGCGGTCCCCTT
CCCCCCGTTTACGGCTGCGGTGG
*/
/*
ACGGGCGTCGTCCCCGTCGTCGTATCfCTCGTCGTCCCCGTCGTCGTGTC
*/
/*
1
5
TATCTGGATTCATTAGCACTTGCATGCTATGTTCCTATTTTATGTAAAACTTTAAGTCCTAAGTCTGCTCCGCAACAACACCAACATACATCAGAG
TTAAAGGCGTCGAGTCGATGTTTTTAACAGGTCTAGCGTACAGCGGTAGGGCCCAACA
GGACATCGATCAACTGACCATTTAAAACGCGATGCTCTCGGGGTACCAGGACCTCCAGGGTC
GTTGCGTTCGCAGTCGCTGTAGACGGAACCGAACGCACACTGCCCGTGCGCCAGGGAGG
TAGACACCCGGCATGCCGTGACT
*/
2020/7/25 19:26
加载中...