最近在学 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;
}
}
WA了两个点; 改了改代码之后
#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函数, 但是对了,这是为什么?
还有,机房里的大佬说没有我这写法的,真的吗? 我觉得挺好理解的啊 。