USACO 5.5.2 Hidden Password

题目大意:

给你一个长为l的字符串s,求它的最小表示法的最小起始位置。
最小表示法:将原字符串看成循环串,从某处开始的字典序最小的串。
 
简单题解:
参见2003周源论文《浅析“最小表示法”思想 在字符串循环同构问题中的应用》。
初始化两个指针i=0,j=1。
依次向后匹配,若失配,则将失配字符较大的指针移到失配字符之后
 
我的代码:
 1 /*
 2 ID:t-x.h1
 3 LANG:C++
 4 TASK:hidden
 5 */
 6 #include<cstdio>
 7 #define min(x,y) ((x)<(y)?(x):(y))
 8 FILE *fi=fopen("hidden.in","r"),*fo=fopen("hidden.out","w");
 9 const int MAXl=100000+9;
10 char s[MAXl];
11 int main()
12 {
13         int l,i,j,k,ti,tj;
14         fscanf(fi,"%d",&l);
15         for(i=0;i<l;++i)
16         {
17                 s[i]=fgetc(fi);
18                 if(s[i]<'a' || s[i]>'z')
19                         --i;
20         }
21         for(i=0,j=1,k=0;i<l && k<l && j<l;)
22         {
23                 ti=(i+k)%l,tj=(j+k)%l;
24                 if(s[ti]==s[tj])
25                         ++k;
26                 else
27                 {
28                         if(s[ti]>s[tj])
29                                 i+=k+1;
30                         else
31                                 j+=k+1;
32                         k=0;
33                         if(i==j)
34                                 ++j;
35                 }
36         }
37         fprintf(fo,"%d\n",i<j?i:j);
38         fclose(fi);
39         fclose(fo);
40         return 0;
41 }  

 

转载于:https://www.cnblogs.com/txhwind/archive/2012/08/18/2645336.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值