Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 滚动哈希实现的问题_C++_Algorithm - Fatal编程技术网

C++ 滚动哈希实现的问题

C++ 滚动哈希实现的问题,c++,algorithm,C++,Algorithm,我试图解决一个问题,我必须找到字符串中长度为“plen”的回文数(最多30000)。我考虑使用滚动散列技术来计算长度为plen的所有子字符串的散列及其反向。如果散列匹配,我假设相等,希望我选择的常量应该足够了。下面是我的实现,我似乎搞砸了。它也不适用于简单的情况。有人能告诉我我的错误吗?谢谢 int MUL = 37; int MOD = 9999991; for(int i = 1 , pwr = 1 ; i < plen ; i++) pwr = (pwr * MUL) % MOD;

我试图解决一个问题,我必须找到字符串中长度为“plen”的回文数(最多30000)。我考虑使用滚动散列技术来计算长度为plen的所有子字符串的散列及其反向。如果散列匹配,我假设相等,希望我选择的常量应该足够了。下面是我的实现,我似乎搞砸了。它也不适用于简单的情况。有人能告诉我我的错误吗?谢谢

int MUL = 37;
int MOD = 9999991;

for(int i = 1 , pwr = 1 ; i < plen ; i++) pwr = (pwr * MUL) % MOD;
long long hash = number[0];
long long revHash = number[plen - 1];
for(int i = 1 ; i < plen  ; i++)
{
    hash = (MUL*hash + number[i])%MOD;
    revHash = (revHash*MUL + number[plen - i - 1])%MOD;

}

cout << hash << " " << revHash <<"\n";

int cnt = (hash == revHash);

for(int i = plen ; i < numbers ; i++)
{
    hash = (hash + (MOD - pwr)*number[i - plen])%MOD;
    hash = (hash*MUL + number[i])%MOD;


    revHash = ((revHash + MOD - number[i - plen]))%MOD;
    revHash = (revHash + pwr*number[i])%MOD;

    cnt += (hash == revHash);

    cout << hash << " " << revHash << "\n";

}
intmul=37;
int MOD=999991;
对于(inti=1,pwr=1;i通常情况下,相等的哈希并不意味着相等的值,因此(无论您在实现中是否犯了错误)这个想法将不起作用。在我脑海中,你可以使用动态规划在
O(n^2)
中这样做,注意到从位置
i1
开始到位置
i2
结束的字符串是一个回文,如果开始字母和结束字母相等,从位置
i1+1
开始到位置
i2-1
结束的字符串也是回文。哦,我看错了,我以为你在寻找任意长度的回文数。在长度
n
的字符串中,长度
p
的回文数更容易:只有
n-p+1
可能的字符串,所以只需单独检查它们。