查看: 1370|回復: 1
打印 上一主題 下一主題

[解決] 寫TOJ-29時遇到指標與參照的RE...

[複製鏈接]
  • TA的每日心情
    鬱悶
    2015-5-15 22:38
  • 簽到天數: 33 天

    [LV.5]常住居民I

    75

    主題

    302

    帖子

    766

    積分

    版主

    TFcis - 105 附設監工官

    Rank: 7Rank: 7Rank: 7

    積分
    766

    台南一中資訊社程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-9-17 23:28:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    本帖最後由 jd3 於 2014-9-17 23:29 編輯

    我真的不知道為什麼只要動到nxt就會RE啊啊啊啊啊連判斷式都死掉...
    RE的地方 : " if(nxt == NULL) "
    (旁邊有驚嘆號的地方)

    [C++] 純文本查看 復制代碼
    #include<iostream>
    #include<cstdio>
    #include<queue>
    
    
    using namespace std;
    
    
    struct Trie
    {
            int contain;
            int number;
            Trie* next[26];
            Trie* fail;
            Trie* pre;
            
            Trie(){
                    for(int i = 0 ; i < 26 ; i++)
                            next[i] = NULL;
            };
            Trie(int n , Trie *p){
                    number = n;
                    contain = -1;
                    for(int i = 0 ; i < 26 ; i++)
                            next[i] = NULL;
                    pre = p;
                    fail = pre;
            };
    };
    
    
    bool yes[1024];
    Trie* root;
    int n;
    char str[1000010];
    
    
    //convert
    int cv(int a)
    {
            return a-'a';
    }
    
    void Insert(char word[], int num)
    {
            Trie* p = root;
            for(int i = 0 ; word[i] ; i++)
            {
                    Trie *& nxt = p->next[cv(word[i])];
                    
                    if(nxt == NULL)                // !!!
                    {
                            nxt = new Trie(cv(word[i]), p);
                    }
                    p = nxt;
            }
            p->contain = num;
            
    }
    
    inline void Build_Fail()
    {
            queue<Trie*> que;
            Trie* p = root;
            for(int i = 0 ; i < 26 ; i++)
                    if(p->next[i] != NULL)
                            for(int j = 0 ; j < 26 ; j++)
                                    if(p->next[i]->next[j] != NULL)
                                            que.push(p->next[i]->next[j]);        
            while(que.size())
            {
                    p = que.front();        que.pop();
                    while(p->fail != root)
                    {
                            p->fail = p->fail->fail;
                            if(p->fail->next[p->number] != NULL)
                                    break;
                    }
                    
                    for(int i = 0 ; i < 26 ; i++)
                            if(p->next[i] != 0)
                                    que.push(p->next[i]);
            }
    }
    
    inline void AC()
    {
    }
    
    int main()
    {
            int t;
            char word[64];
            
            scanf("%d", &t);
            while(t--)
            {
                    scanf("%s", str);
                    scanf("%d", &n);
                    for(int i = 0 ; i < n ; i++)
                    {
                            scanf("%s", word);
                            for(int j = 0 ; word[j] ; j++)
                                    if('A' <= word[j] && word[j] <= 'Z')
                                            word[j] = word[j] + 'a'-'A';
                            Insert(word, i);
                    }
                    
                    Build_Fail();
                    
                    AC();
            }
    }
    

    <這是個人簽名欄位>
    回復

    使用道具 檢舉

  • TA的每日心情
    鬱悶
    2015-5-15 22:38
  • 簽到天數: 33 天

    [LV.5]常住居民I

    75

    主題

    302

    帖子

    766

    積分

    版主

    TFcis - 105 附設監工官

    Rank: 7Rank: 7Rank: 7

    積分
    766

    台南一中資訊社程式設計達人 - 2014

    頭香
     樓主| 發表於 2014-9-17 23:29:47 | 只看該作者
    啊啊我自己發現問題了
    <這是個人簽名欄位>
    回復 支持 反對

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表