KMP-(POJ 2406)Power Strings[字符串乘方]

ゞ 浴缸里的玫瑰 2022-05-17 08:51 256阅读 0赞
  • KMP-(POJ 2406)Power Strings[字符串乘方]


  • 题目链接:Power Strings

  • 思路:最小循环节

看到乘方,很明显是求给定字符串由它的最小循环子串循环得到的次数

那就是求出NEXT数组,再而求出最小循环节长度:Len-NEXT[Len]

有三种情况,分两类

①给定字符串循环子串是其本身:乘方等于1

a.NEXT[Len]=0 栗如:abcd

b.NEXT[Len]!=0,but Len%(Len-NEXT[Len]) != 0所求循环节长度与字符串长度不成倍数,例如abbbabb,求得的可能最小循环节为abbb,很明显不是真正的循环子串,真正的最小循环节应为本身:abbbabb

②子串为最小循环节

c.Len%(Len-NEXT[Len])=0,那么循环次数也就是乘方为 Len/(Len-NEXT[Len])

  • 题目基础:KMP-NEXT数组的性质

KMP算法-求NEXT数组: 串的模式匹配算法-KMP算法

最小循环节:KMP-(HDU1358)Period[前缀中的周期]

  • 代码:

    include

    include

    using namespace std;
    //KMP POJ 2406

    define MAX_Length 1000005

    int Next[MAX_Length];
    int len;
    char Str[MAX_Length];

  1. void KMP()
  2. {
  3. int j = -1, k = 0;
  4. Next[0] = -1;
  5. while (k < len)
  6. {
  7. if (j == -1 || Str[j] == Str[k])
  8. {
  9. j++;
  10. k++;
  11. Next[k] = j;
  12. }
  13. else
  14. j = Next[j];
  15. }
  16. }
  17. int main()
  18. {
  19. while (cin >> Str && Str[0] != '.')
  20. {
  21. len = strlen(Str);
  22. KMP();
  23. int Min_Period_Len = len - Next[len]; //求出最小循环节长度
  24. if (Min_Period_Len == len || len % Min_Period_Len) //循环节是本身的情况,那么乘方是1
  25. cout << "1" << endl;
  26. else
  27. {
  28. int Period_Num = len / Min_Period_Len; //求出循环次数
  29. cout << Period_Num << endl;
  30. }
  31. }
  32. return 0;
  33. }

发表评论

表情:
评论列表 (有 0 条评论,256人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Power Strings

    写在题目前:POJ太好用啦! 描述 给定两个字符串a和b,我们将\ b定义为它们的串联。例如,如果a =“abc”而b =“def”则a \ b =“abcdef”。如果我