2016-05-06 13 views
0

関数からのベクトルを返しても問題はありませんか?それとも基本的な構文上の問題ですか?このKMPコードでランタイムエラーが表示されるのはなぜですか?

CLRSのサンプルコードです。 computePrefix関数は、与えられたパターンの適切な接頭辞の値を計算し、main関数の値と一致します。

より正確なSIGSEGVエラーの取得。あなたの親切なアドバイスは本当に役に立ちます。

ありがとうございます。それに要素を追加するpush_backを行い、vectorを使用するためには

#include <bits/stdc++.h> 

using namespace std; 

int main() 
{ 
    string text, pattern; 
    vector<int> computePrefixFunction(string p); 
    cin >> text; 
    cin >> pattern; 
    int n = text.length(); 
    int m = pattern.length(); 
    vector<int> pi = computePrefixFunction(pattern); 
    int q = -1; 
    for(int i = 0; i < n; ++i) 
    { 
     while(q > -1 && pattern[q+1] != text[i]) 
      q = pi[q]; 
     if(pattern[q+1] == text[i]) 
      q = q + 1; 
     if(q == (m-1)) 
     { 
      cout << "Pattern occurs from position: " << q - m + 1 << '\n'; 
      q = pi[q]; 
     } 
    } 
    return 0; 
} 

vector<int> computePrefixFunction(string p) 
{ 
    int m = p.length(); 
    vector<int> pi; 
    pi[0] = -1; 
    int k = -1; 
    for(int q = 0; q < m; ++q) 
    { 
     while(k > -1 && p[k+1] != p[q]) 
      k = pi[k]; 
     if(p[k+1] == p[q]) 
      k = k + 1; 
     pi[q] = k; 
    } 
    return pi; 
} 

答えて

1

computePrefixFunctionの2行目のようにサイズを指定せずに初期化すると、pi[0]またはpi[q]にアクセスしようとすると、ランタイムエラーが発生します。代わりにpi.push_back(value)を実行します。

+0

はい、うまくいきました!ありがとう。 – Bhattacharjee

+0

それは@ user3805080を助けてくれてうれしいです。それがあなたのために働いているなら、アップホートしてください。 – yelsayed

関連する問題