zoukankan      html  css  js  c++  java
  • HDU-3746 Cyclic Nacklace KMP循环节

    题意:
    给定一个字符串,问最少需要添加几个字符可以使之变为循环序列。

    考虑到字符串的最小循环节。

    对于len2这个点,若len2 % (len2 - Next[len2]) == 0 则存在最小循环节,长度即len2 - Next[len2]。循环次数 len2 / (len2 - Next[len2])。

    因此当满足 len2 % (len2 - Next[len2]) == 0 时且Next[len2] 不为0时,答案就是0,否则len2

    若不等于0,那么就是对当前可能的最小循环节补齐。

    输出len2 - Next[len2] - len2 % (len2 - Next[len2])。

    注意多组数据,初始化Next

    char s1[1005], s2[100005];
    int Next[100005];
    int len1, len2;
    
    void get_Next() {
        for (int i = 2, j = 0; i <= len2; i++) {
            while (s2[i] != s2[j + 1] && j > 0) j = Next[j];
            if (s2[i] == s2[j + 1]) Next[i] = ++j;
        }
    }
    
    
    int main() {
        int T;
        T = readint();
        while (T--) {
            memset(Next, 0, sizeof Next);
            scanf("%s", s2 + 1);
            len2 = strlen(s2 + 1);
            get_Next();
            if (len2 % (len2 - Next[len2])) {
                printf("%d
    ",(len2 - Next[len2] - (len2 % (len2 - Next[len2]))));
            }
            else {
                if (!Next[len2]) printf("%d
    ", len2);
                else puts("0");
            }
        }
    }
  • 相关阅读:
    java10 var
    java lambda,方法引用
    Java集合总结
    Oracle/Sun JDK与OpenJDK的区别和联系
    IO基本知识
    字符串反转2单词内部不进行转换
    反转String 1
    java 左移<<&>>右移&>>无符号右移
    反射
    equals方法与hashcode方法
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13451131.html
Copyright © 2011-2022 走看看