Spring學習總結(四):基於XML的Bean裝配中常見操作
阿新 • • 發佈:2021-01-18
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