[关闭]
@xingxing 2017-03-31T15:53:05.000000Z 字数 676 阅读 639

专题八 字符串

题解字符串


[题目][A]

最小表示法

题目大意:

有N个测试样例,每个测试有一个字符串,输出这个字符串循环同构的最小表示的开始下标i。(i要求尽量取小,当有多个最小表示的时候)

解题思路:

用i,j来记录较小字典序的字符串的开始位置。初始化i=0,j=1,然后比较s[i+k],s[j+k]的大小,如果相等,就继续比较下一个字符,否则将大的字符的初始下标往后移动k+1位(前一次两个字符串匹配的长度+1),如果两个下标位置i,j相等,则将j加一,错开。最后当i或者j大于了字符串长度,即所有情况都处理完了。这时,输出较小的下标。

AC代码:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdlib>
  5. using namespace std;
  6. char a[10005];
  7. int getmin(int l)
  8. {
  9. int i = 0,j = 1,k = 0,t;
  10. while(i < l && j < l)
  11. {
  12. if(k == l) return i;
  13. t = a[(i+k)%l] - a[(j+k)%l];
  14. if(t == 0) k++;
  15. else
  16. {
  17. if(t > 0) i += k+1;
  18. else j += k+1;
  19. if(i == j) j++;
  20. k = 0;
  21. }
  22. }
  23. if(i < l) return i;
  24. else return j;
  25. }
  26. int main()
  27. {
  28. // freopen("in.txt","r",stdin);
  29. int n;
  30. scanf("%d",&n);
  31. while(n--)
  32. {
  33. scanf("%s",a);
  34. printf("%d\n",getmin(strlen(a)) + 1);
  35. }
  36. return 0;
  37. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注