1. 程式人生 > 其它 >Spring學習總結(四):基於XML的Bean裝配中常見操作

Spring學習總結(四):基於XML的Bean裝配中常見操作

http://www.fjutacm.com/Problem.jsp?pid=2411

看到這題,我第一反應簡單啊,刷刷刷把程式碼敲好交了一發

#include<stdio.h>
#include<string.h>
int main()
{
    char s1[200000],s2[200000],s3[200000];
    int l,k;
    while(~scanf("%s",s1)){
        k=0;
        l=strlen(s1);
        strcpy(s3,s1);
        strcpy(s2,s1);
        strcat(s1,s2);
        
while(strcmp(s3,s2)>=0){ k++; for(int i=0;i<l;i++){ s3[i]=s1[i+k]; } } puts(s3); } return 0; }

不就比較字典序嘛,一個strcmp就解決了,很快啊

然後果不其然

然後尋找大佬幫助,大佬的思路如下:

1.雙指標i,j;

2.通過"把已經比較過相等的字元跳過,從最後一個相等的字元的下一個字元開始比較字典序。"的方法降低時間複雜度;

3.然後就是i+k和j+k的三種情況,相等小於大於分別處理;

4.注意事項:i+k要取模防止溢位;i+k和j+k不相等時k=0;i和j相等時i++或者j++,要使它們指向兩個不同的位置;

5.最後取i和j裡小的那一個。

放程式碼:

#include<stdio.h>
#include<string.h>
int main()
{
    char s[200005];
    int i,j,l,k,x;
    while(~scanf("%s",s)){
        i=0,j=1,k=0;
        l=strlen(s);
        while(i<l&&j<l&&k<l){
            
if(s[(i+k)%l]==s[(j+k)%l]) k++; else if(s[(i+k)%l]<s[(j+k)%l]){ j=j+k+1; if(i==j) j++;//i和j要指向不同位置 k=0;//k要重置為0 } else if(s[(i+k)%l]>s[(j+k)%l]){ i=i+k+1; if(i==j) i++; k=0; } } if(i<j) x=i; else x=j; for(int i=0;i<l;i++){ printf("%c",s[(i+x)%l]); } printf("\n"); } return 0; }

PS:感謝大佬友情提示!

EOF