最小表示法
int n=strlen(s+1); for(int i=1; i<=n; i++) s[n+i]=s[i]; int i=1,j=2,k; while(i<=n&&j<=n) { for(k=0; k); if(k==n) break; if(s[i+k]>s[j+k]) { i=i+k+1; if(i==j) i++; } else { j=j+k+1; if(i==j) j++; } } ans=min(i,j);//B[ans]是最小表示
树的最小表示
int n=strlen(s+1); for(int i=1; i<=n; i++) s[n+i]=s[i]; int i=1,j=2,k; while(i<=n&&j<=n) { for(k=0; k); if(k==n) break; if(s[i+k]>s[j+k]) { i=i+k+1; if(i==j) i++; } else { j=j+k+1; if(i==j) j++; } } ans=min(i,j);//B[ans]是最小表示
树的最小表示