HDOJ3746 Cyclic Nacklace(kmp)

来源:互联网 发布:mac快捷键向上箭头 编辑:程序博客网 时间:2024/04/29 21:38

题目链接:点击打开链接


给你一个字符串,问你最少添加几个字符可以使字符串有循环节。

利用nxt数组的性质,len - nxt[len]即为字符串的最小循环节,且如果len % (len - nxt[len]) == 0,那么当前字符串就是有循环节的,且

最小循环节为len / (len - nxt[len])。


AC代码:

#include "iostream"#include "cstdio"#include "cstring"#include "algorithm"using namespace std;const int MAXN = 1e5 + 5;char s[MAXN];int nxt[MAXN], len;void get_nxt(){nxt[1] = 0;int j = 0;for(int i = 2; i <= len; ++i) {while(j > 0 && s[j + 1] != s[i])j = nxt[j];if(s[j + 1] == s[i]) j++;nxt[i] = j;}}int main(int argc, char const *argv[]){int t;scanf("%d", &t);while(t--) {memset(nxt, 0, sizeof(nxt));scanf("%s", s + 1);len = strlen(s + 1);get_nxt();int ans = len - nxt[len];if(ans == len) printf("%d\n", len);else if(len % ans == 0) printf("0\n");else printf("%d\n", ans - len % ans);}return 0;}


1 0
原创粉丝点击