[关闭]
@sensitive-cs 2017-03-28T00:35:43.000000Z 字数 1084 阅读 742

CQUPT 字符串

to be write : 最小表示法
题意:
给出一个字符串,求出这个字符串的最小表示法,即字典序最小。
思路:
循环比较,具体看紫书。需要注意的是此题与循环队列的联系。
代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. char s[10005];
  4. int les(int n,int p,int q)
  5. {
  6. for (int i = 0;i < n;i++)
  7. if (s[(p+i) % n] != s[(q+i)%n]) return s[(p+i) % n] < s[(q+i)%n];
  8. return 0;
  9. }
  10. int main()
  11. {
  12. int t;
  13. scanf("%d",&t);
  14. while (t--)
  15. {
  16. int ans = 0;
  17. scanf("%s",s);
  18. int len = strlen(s);
  19. for (int i = 1;i < len;i++)
  20. if (les(len,i,ans)) ans = i;
  21. printf("%d\n",ans+1);
  22. }
  23. return 0;
  24. }

poj3974:palindrome
题意:
找出一个字符串的最长回文字串的长度。
思路:
马拉车算法,裸题。
代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn = 1000020;
  6. int p[2*maxn + 50];
  7. char s[2*maxn + 50];
  8. char ch[2*maxn + 50];
  9. int main()
  10. {
  11. int cnt = 1;
  12. while (scanf(" %s",s) != EOF)
  13. {
  14. if (s[0] == 'E') break;
  15. memset(ch,0,sizeof(ch));
  16. memset(p,0,sizeof(p));
  17. ch[0] = '$',ch[1] = '#';
  18. int len = 1,maxright = 0,pos = 0;
  19. int ll = 0;
  20. while (s[ll] != '\0')
  21. {
  22. ch[++len] = s[ll];
  23. ch[++len] = '#';
  24. ll++;
  25. }
  26. for (int i = 2;i <= len;i++)
  27. {
  28. if (i < maxright) p[i] = min(p[2*pos-i],maxright-i);
  29. else p[i] = 1;
  30. while (ch[i-p[i]] == ch[i+p[i]]) p[i]++;
  31. if (i+p[i] > maxright)
  32. {
  33. maxright = i+p[i];
  34. pos = i;
  35. }
  36. }
  37. ch[len+1] = '\0';
  38. int ans = 0;
  39. for (int i = 2;i <= len;i++)
  40. ans = max(ans,p[i]-1);
  41. printf("Case %d: %d\n",cnt++,ans);
  42. }
  43. return 0;
  44. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注