本文共 1298 字,大约阅读时间需要 4 分钟。
直接说结论吧,KMP算法的前提是预处理一个next数组 ,一个字符串长度为len,那么这个字符串的最小循环节就是len-nxt[len]。
因此有:AC代码:
/* * @Author: hesorchen * @Date: 2020-07-03 17:05:01 * @LastEditTime: 2020-07-12 17:06:22 * @Description: https://hesorchen.github.io/ */#includeusing namespace std;#define IOS \ ios::sync_with_stdio(false); \ cin.tie(0); \ cout.tie(0);#define FRE \ { \ freopen("in.txt", "r", stdin); \ freopen("out.txt", "w", stdout); \ }#define ll long longll nxt[100010];char a[100010];void get_nxt(){ ll len = strlen(a); ll j = 0, k = -1; nxt[0] = -1; while (j < len) { if (k == -1 || a[j] == a[k]) nxt[++j] = ++k; else k = nxt[k]; }}int main(){ IOS; ll t; cin >> t; while (t--) { cin >> a; get_nxt(); if (strlen(a) % (strlen(a) - nxt[strlen(a)]) == 0 && nxt[strlen(a)] != 0) cout << 0 << endl; else cout << strlen(a) - nxt[strlen(a)] - (nxt[strlen(a)] % (strlen(a) - nxt[strlen(a)])) << endl; } return 0;}
转载地址:http://sgod.baihongyu.com/