python代码如下:
class State:
def __init__(self, val, par=None):
self.val = val
self.par = par
self.go = {}
def extend(w):
global res, last
p = last
np = State(p.val + 1)
while p is not None and w not in p.go.keys():
p.go[w] = np
p = p.par
if p is None:
np.par = root
else:
q = p.go[w]
if q.val == p.val + 1:
np.par = q
else:
nq = State(p.val + 1)
# nq.go = copy.deepcopy(q.go) 会造成 Maximum recursion depth exceeded
for k in q.go: nq.go[k] = q.go[k]
nq.par = q.par
q.par = nq
np.par = nq
while p is not None and p.go[w] is q:
p.go[w] = nq
p = p.par
res += np.val - np.par.val
last = np
# fo = open("result.txt", "a")
# fo.write(str(res) + "\r\n")
# fo.close()
while True:
global res, root, last
try:
root = last = State(0)
res = 0
# s = "aabbabd"
s = raw_input()
for i in s:
extend(ord(i) - ord('a'))
print res
except EOFError:
break
已经通过的C++代码如下:
#include
using namespace std;
// 注意要用 long long 和 1000001,要不然得出结果不对
// 因为原题说了字符串长度不超过 1000000,结果它的测试用例真的有一个长度为 1000000 的字符串。。。
// 亲身验证,缺一个都不好使
long long res = 0;
const int MAXN = 1000001;
struct State {
State *par, *go[26];
int val;
State(int _val) : par(0), val(_val) {
memset(go, 0, sizeof go);
}
};
State *root, *last;
void extend(int w) {
State *p = last;
State *np = new State(p->val + 1);
while (p && p->go[w] == 0)
p->go[w] = np, p = p->par;
if (p == 0) {
np->par = root;
} else {
State *q = p->go[w];
if (q->val == p->val + 1) {
np->par = q;
} else {
State *nq = new State(p->val + 1);
memcpy(nq->go, q->go, sizeof q->go);
nq->par = q->par;
q->par = nq;
np->par = nq;
while (p && p->go[w] == q)
p->go[w] = nq, p = p->par;
}
}
res += np->val - np->par->val;
last = np;
//ofstream out;
//out.open("result.txt", ios::out|ios::ate|~ios::trunc);
//out << (char)(w + 97) << " " << res << "\r\n";
//out.close();
}
char str[MAXN];
int main() {
root = last = new State(0);
scanf("%s", str);
int len = strlen(str);
int i = 0;
for (i = 0; i < len; i++)
extend(str[i] - 'a');
// 不知道为啥 CLion 加上输入回显之后,当字符串长度很大时比如 10000
// 上面的循环循环不完,在 i 等于一个值就不走循环了
// cout << i << str[i] << "\n";
cout << res;
return 0;