首页 > 其他 > 详细

POJ 1509 循环同构的最小表示法

时间:2015-06-11 14:16:46      阅读:194      评论:0      收藏:0      [点我收藏+]

 题目大意:

给定一个字符串,可以把一段尾部接到头部,这样找到一个最小的字符串

 

方案一:

利用循环同构中找最小表示的方法来解决

论文参考http://wenku.baidu.com/view/438cad13a2161479171128b6.html

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 
 5 using namespace std;
 6 #define N 10005
 7 char s[N];
 8 
 9 inline int minpos(char *s)
10 {
11     int l = strlen(s);
12     int i=0 , j=1 , k=0;
13     while(i<l&&j<l&&k<l){ //这里k<l是防止出现所有数都一样导致无限循环
14         if(i == j) j++;
15         else if(s[(i+k)%l]>s[(j+k)%l]){
16             i = i+k+1;
17             k=0;
18         }
19         else if(s[(i+k)%l]<s[(j+k)%l]){
20             j = j+k+1;
21             k=0;
22         }
23         else k++;
24     }
25     return min(i , j)+1;
26 }
27 
28 int main()
29 {
30    // freopen("a.in" , "r" , stdin);
31     int T;
32     scanf("%d" , &T);
33     while(T--)
34     {
35         scanf("%s" , s);
36         printf("%d\n" , minpos(s));
37     }
38     return 0;
39 }

 

POJ 1509 循环同构的最小表示法

原文:http://www.cnblogs.com/CSU3901130321/p/4568786.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!