鍚庣紑鏁扮粍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了鍚庣紑鏁扮粍相关的知识,希望对你有一定的参考价值。

鏍囩锛?a href='http://www.mamicode.com/so/1/%e6%8a%80%e6%9c%af' title='鎶€鏈?>鎶€鏈?/a>   csdn   cpp   浠g爜   鎬庝箞   瀛樺湪   鑰屼笖   骞朵笖   

棰樼洰寰?del>绠€鍗?/del>锛屽氨鏄粰鍑轰竴涓瓧绗︿覆锛屾妸杩欎釜瀛楃涓茬殑鎵€鏈夐潪绌哄悗缂€浠庡皬鍒板ぇ鎺掑簭鍚庯紝鎸夐『搴忚緭鍑?strong>鍚庣紑鐨勭涓€涓瓧绗?/strong>鍦ㄥ師涓蹭腑鐨勪綅缃€?/p>

鏍蜂緥

杈撳叆鏍蜂緥锛?/strong>

ababa

杈撳嚭鏍蜂緥锛?/strong>

5 3 1 4 2

瑙i噴锛?/strong>

鎺掑ソ搴忓悗涓猴細

  1. a

  2. aba

  3. ababa

  4. ba

  5. baba

鏆村姏鑲畾涓嶈鍟︼紒
杩欓噷鎴戜滑浣跨敤涓€涓彨鍚庣紑鏁扮粍鐨勪笢瑗?/p>

PS:鎼炴噦妯$増杩樿鎰熻阿澶т浆zhangjianweivv鐨勫崥瀹紒

浠€涔堟槸鍚庣紑鏁扮粍锛?/h2>

鍚庣紑鏁扮粍涓?code>rank[i]锛屼负Suffix array鐨勭畝鍐欙紝琛ㄧず鎺掑悕涓篿鐨勫瓧绗︿覆鐨?缂栧彿 锛圥S锛氳繖閲岋紝鎴戜滑绠€绉版帓搴忓悗鍚庣紑鐨勭涓€涓瓧绗︽墍鍦ㄧ殑浣嶇疆涓?缂栧彿 锛?/p>

杩樻湁涓€涓帺鎰忓効鍙?strong>鍚嶆鏁扮粍锛屼负rank[i]锛岃〃绀?strong>缂栧彿涓篿鐨勫瓧绗︿覆鐨?鎺掑悕

鍙互鍙戠幇锛?code>rank[i]鏄?code>sa[i]鐨勯€嗚繍绠楋紝鑰屼笖鎴戜滑鎵€闇€瑕佺殑绛旀灏辨槸sa[i]

鍥剧墖鏉ユ簮锛氥€婂悗缂€鏁扮粍--澶勭悊瀛楃涓叉湁鍔涘伐鍏枫€?/p>

  • 鎴戜滑鍏堟妸瀛楃涓茬殑姣忎釜瀛楁瘝鎺掑簭锛屽瓨鍦?code>rank鏁扮粍閲岄潰锛屾垜浠涓鸿繖鏄?strong>绗竴鍏抽敭瀛?/strong>

  • 鐒跺悗鎴戜滑灏嗙涓€鍏抽敭瀛楁瘡闅?2^k$鐨勫瓧绗︾殑鎺掑悕浣滀负绗簩鍏抽敭瀛?/strong>
  • 杩欐椂锛屾垜浠娇鐢?strong>璁℃暟鎺掑簭锛堢綉涓婂緢澶氶兘璇存槸鍩烘暟鎺掑簭锛屼絾鍏跺疄鏄鏁版帓搴忥級灏嗚繖涓や釜鍏抽敭瀛楁帓搴忥紝灏辩被浼间簬涓や綅鏁板瓧鐨勬帓搴?/li>
  • 灏嗘帓搴忓悗鐨勭粨鏋滀綔涓虹涓€鍏抽敭瀛楋紝鐒跺悗缁х画寰幆绗簩锛屼笁娆℃搷浣?/p>


鍥剧墖鏉ユ簮锛歫inkun113澶т浆鐨勫崥瀹?/p>

绫讳技浜庢《鎺掑簭锛?/p>

  • 鍏堟寜涓綅鐨勬暟瀛椾竴涓釜鏀惧叆0~9鐨勬《閲岋紝鍐嶆寜椤哄簭浠?~9鍙栧嚭鏉ワ紝锛堝綋鐒跺鏋滀綘鏄粠澶у埌灏忓氨鏄?~0鍟︼紒锛?/p>

  • 鎺ョ潃鍐嶆寜鍗佷綅鐨勬暟瀛椾竴涓釜鏀惧叆妗堕噷锛屾寜椤哄簭鍙栧嚭鏉ワ紝濡傛灉鏄袱浣嶆暟锛岃繖鏃舵垜浠緱鍒扮殑灏辨槸绛旀锛?/li>
  • 浠ユ绫绘帹锛屼竴鐩村惊鐜埌鏈€鍚庝竴浣?/p>

璁℃暟鎺掑簭锛屽氨鏇撮珮绾т簡銆傝繖閲屼紭鍖栦簡涓€涓嬶紝
灏辨槸鎴戜滑鍦ㄥ熀鏁版帓搴忔墍鐢ㄧ殑妗讹紝鏄褰曚粬鍑虹幇鐨勬鏁?/strong>锛岀劧鍚?strong>绱姞(鍐欏叆浠g爜灏辨槸cnt[i]+=cnt[i-1])锛岃繖鏍锋垜浠緱鍒扮殑cnt[i]鏁扮粍閲屽氨鏄?strong>涓嶅ぇ浜巌鐨勪釜鏁?/strong>锛屽氨鏄粬鐨勬帓鍚嶄簡锛?/p>

rank[i]琛ㄧず缂栧彿涓篿鐨勬帓鍚? sa[i]琛ㄧず鎺掑悕涓篿鐨勭紪鍙? cnt[i]璁℃暟鎺掑簭鐨勬《 pos[i]琛ㄧず褰撳墠绗簩鍏抽敭瀛楀凡缁忔帓濂藉簭鏃剁i鍚嶇浜屽叧閿瓧鎵€瀵瑰簲鐨勭涓€鍏抽敭瀛椾綅缃?tmp[i] 鎺掑簭鏃讹細琛ㄧず褰撳墠鎺掑簭涓紪鍙蜂负i鐨勬帓鍚?鎺掑簭鍚庯細琛ㄧず璋冩暣rank鍓嶇殑鎺掑悕
#include<cstdio>
#include<cstring>
using namespace std;
/*
rank[i]琛ㄧず缂栧彿涓篿鐨勬帓鍚?
sa[i]琛ㄧず鎺掑悕涓篿鐨勭紪鍙?
cnt[i]璁℃暟鎺掑簭鐨勬《 
pos[i]琛ㄧず褰撳墠绗簩鍏抽敭瀛楀凡缁忔帓濂藉簭鏃剁i鍚嶇浜屽叧閿瓧鎵€瀵瑰簲鐨勭涓€鍏抽敭瀛椾綅缃?tmp[i]
鎺掑簭鏃讹細琛ㄧず褰撳墠鎺掑簭涓紪鍙蜂负i鐨勬帓鍚?鎺掑簭鍚庯細琛ㄧず璋冩暣rank鍓嶇殑鎺掑悕
*/
char s[1200000];
int cnt[1200000],pos[1200000],sa[1200000],tmp[1200000],rank[1200000];
bool pd(int x,int y,int k)return tmp[x]==tmp[y]&&tmp[x+k]==tmp[y+k];
void suffix(int n,int m)

    int i,k;
    for(i=1;i<=n;i++)rank[i]=s[i],cnt[rank[i]]++;
    for(i=1;i<=m;i++)cnt[i]+=cnt[i-1];
    for(i=n;i>=1;i--)sa[cnt[rank[i]]--]=i;//璁℃暟鎺掑簭锛岃缃ソrank鍜宻a鏁扮粍 
    for(k=1;k<n;k<<=1)//k琛ㄧず闀垮害,k<<1琛ㄧずk*2 
    
        int len=0;for(i=n-k+1;i<=n;i++)pos[++len]=i;//濡傛灉绗簩鍏抽敭瀛椾负0鐨勮瘽锛岃偗瀹氭渶灏忥紝鎴戜滑鍏堝姞鍏os 
        for(i=1;i<=n;i++)if(sa[i]>k)pos[++len]=sa[i]-k;//鍑嗗濂絧os鏁扮粍 
        
        memset(cnt,0,sizeof(cnt));
        for(i=1;i<=n;i++)tmp[i]=rank[pos[i]],cnt[tmp[i]]++;
        for(i=1;i<=m;i++)cnt[i]+=cnt[i-1];
        for(i=n;i>=1;i--)sa[cnt[tmp[i]]--]=pos[i];//鏇存柊sa鏁扮粍 
        
        for(i=1;i<=n;i++)tmp[i]=rank[i];//璁板綍涔嬪墠鐨勬帓鍚?
        
        len=1;rank[sa[1]]=1;//鍒濆鍖?
        for(i=2;i<=n;i++)if(pd(sa[i],sa[i-1],k)==false)len++;rank[sa[i]]=len;//閫氳繃sa鏉ユ洿鏂皉ank鏁扮粍锛屽苟涓斿幓閲?
        if(len==n)break;m=len; 
    
    for(i=1;i<n;i++)printf("%d ",sa[i]);
    printf("%d\n",sa[n]);

int main()

    scanf("%s",s+1);int len=strlen(s+1);
    suffix(len,130);//'z'鏄?22 ,涓轰簡淇濋櫓璁剧疆涓?30
    return 0;

以上是关于鍚庣紑鏁扮粍的主要内容,如果未能解决你的问题,请参考以下文章

Mac灏忔妧宸э細鍘婚櫎绯荤粺鎴浘鍚嶇殑鏃ユ湡鍚庣紑

js鏁扮粍鐨勫0鏄庝笌搴旂敤

鏁扮粍鐨勫唴瀛樺浘

鎷兼帴鏁扮粍

鏁扮粍鍘婚噸

娉㈠姩鏁扮粍