[关闭]
@comzyh 2015-07-25T15:14:17.000000Z 字数 558 阅读 1643

字符串的最小表示法

未分类


USACO 5.5.2

  1. int get_min(char *s)
  2. {
  3. int i = 0, j = 1;
  4. int len = strlen(s);
  5. while (i < len && j < len)
  6. {
  7. // printf("i=%4d,j=%4d\n",i,j);
  8. if (s[i] < s[j % len])
  9. j++;
  10. else if (s[i] > s[j % len])
  11. {
  12. i = j;
  13. j = i + 1;
  14. }
  15. else
  16. {
  17. int k;
  18. for (k = 1; k < len && s[(i + k) % len] == s[(j + k) % len]; k++);
  19. if (k == len) //出现循环节
  20. return i;
  21. if (s[(i + k) % len] > s[(j + k) % len])
  22. {
  23. i = j;
  24. j = i + 1;
  25. }
  26. else
  27. {
  28. j = j + k + 1; // i .. j - 1 和 j 开头的都不是最小表示,
  29. }
  30. }
  31. }
  32. return i;
  33. }

POJ 1509

  1. int min_p(const char *s)
  2. {
  3. int len = strlen(s);
  4. int i = 0, j = 1, k;
  5. while (i < len && j < len)
  6. {
  7. for (k = 0; k < len && s[(i + k) % len] == s[(j + k) % len]; k++);
  8. if (k == len)
  9. return i;
  10. if (s[(i + k) % len] > s[(j + k) % len])
  11. swap(i,j);
  12. j = max(i+1,j + k + 1);
  13. }
  14. return i;
  15. }

在此输入正文

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注