【ybtoj 高效进阶 2.3】【kmp】 重复子串

【ybtoj 高效进阶 2.3】【kmp】 重复子串

题目

在这里插入图片描述
在这里插入图片描述


解题思路

将每一个串和自己匹配
处理出next数组
可以得知 x x x[1… n e x t next next[ l e n len len]] 与 x x x[ l e n len len- n e x t next next[ l e n len len]… l e n len len] 是完全匹配的
如果总长度除以这个子串的长度没有余数
说明ta就是由重复连续子串组成的


代码

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char x[1002000];
int len, next[1002000];
int main() {
    
    
    scanf("%s", x + 1);
    len = strlen(x + 1);
    while (!(x[1] == '.' && len == 1)) {
    
      //多组数据
        int k = 0;
        for (int i = 1; i < len; i++) {
    
    
            while (k > 0 && x[i + 1] != x[k + 1]) k = next[k];
            if (x[i + 1] == x[k + 1])
                k++;
            next[i + 1] = k;
        }  //自己匹配
        if (len % (len - next[len]) == 0)  //是否由重复连续子串组成
            printf("%d\n", len / (len - next[len]));
        else
            printf("1\n");
        memset(next, 0, sizeof(next));  //要清0哦
        scanf("%s", x + 1);
        len = strlen(x + 1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45621109/article/details/115022341