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;
}
はい、うまくいきました!ありがとう。 – Bhattacharjee
それは@ user3805080を助けてくれてうれしいです。それがあなたのために働いているなら、アップホートしてください。 – yelsayed