关于KMP的疑惑
  • 板块学术版
  • 楼主wyyxhxcw
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/21 11:15
  • 上次更新2023/10/27 14:20:34
查看原帖
关于KMP的疑惑
770637
wyyxhxcw楼主2022/8/21 11:15

本人萌新

最近在学 KMP算法 做了个题(loj上的)——power strings 之后就有问题了:

第一次的代码如下

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
string s;
string s1;
int net[N], n2;
void kmp() {
    int k = 0, j = 1;
    net[1] = 0;

    while (j < n2) {
        if (k == 0 || s[k - 1] == s[j - 1])
            net[++j] = ++k;
        else
            k = net[k];
    }
}
int main() {
    while (cin >> s) {
        if (s[0] == '.')
            return 0;

        n2 = s.size() ;
        kmp();

        if (n2 % (n2 - net[n2]) == 0) {
            cout << n2 / (n2 - net[n2]) << endl;
        } else
            cout << 1 << endl;
    }
}

结果:Link

WA了两个点; 改了改代码之后

结果:Link2

第二次代码如下

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
string s;
string s1;
int net[N], n2;
void kmp() {
    int k = -1, j = 0;
    net[0] = -1;

    while (j < n2) {
        if (k == -1 || s[k] == s[j])
            net[++j] = ++k;
        else
            k = net[k];
    }
}
int main() {
    while (cin >> s) {
        if (s[0] == '.')
            return 0;

        n2 = s.size() ;
        kmp();

        if (n2 % (n2 - net[n2]) == 0) {
            cout << n2 / (n2 - net[n2]) << endl;
        } else
            cout << 1 << endl;
    }
}

第二次代码只改了子函数没有改main函数, 但是对了,这是为什么?

还有,机房里的大佬说没有我这写法的,真的吗? 我觉得挺好理解的啊 。

毕竟手摸了好几遍了QWQ

2022/8/21 11:15
加载中...