题目链接:https://vjudge.net/problem/HDU-6629
题意:问题目中的if执行多少次
题解:可以看出,若没有超出长度,会执行到第一个不符合的位置,否则由while跳出循环,所以判断一下最终匹配的位置即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int nex[N], ex[N];
void get_nex(char *s) {
int i = 0, j, pos, len = strlen(s);
nex[0] = len;
while(s[i] == s[i + 1] && i + 1 < len) i++;
nex[1] = i;
pos = 1;
for(i = 2; i < len; i++) {
if(nex[i - pos] + i < nex[pos] + pos)
nex[i] = nex[i - pos];
else {
j = nex[pos] + pos - i;
if(j < 0) j = 0;
while(i + j < len && s[j] == s[j + i]) j++;
nex[i] = j;
pos = i;
}
}
}
int main() {
int T;
char s[N];
int len;
ll ans;
scanf("%d", &T);
while(T-- ) {
scanf("%s", s);
len = strlen(s);
get_nex(s);
ans = 0;
for(int i = 1; i < len; i++)
ans += nex[i] + (i + nex[i] != len);
printf("%lld\n", ans);
}
return 0;
}