[C++]环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584)
Question
例题3-5 环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584)
长度为n的环状串有n种表示方法,分别为从某个位置开始顺时针得到,在这些排列中字典顺序最小的称“最小表示”。 如CTCC的最小表示为CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC。 提示:对于两个字符串,从第一的字符开始比较,当某一个位置的字符不同时,该位置字符较小的串,字典序小,如果一个字符串没有更多的字符,但是另一个字符串还没结束,则较短的字符串的字典序较小。
Think
【概念】
字典序:环状字典序/全排列字典序(含:环状字典序)
Code
/* 例题3-5 环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584) */ #include<iostream> #include<string.h> using namespace std; const int maxn = 105; //比较环状串s的两序列q与p的字典序大小,若q<p,返回值:1;反之:0 static int Less(char *s, int len, int q, int p){ int cmp; for(int i=0;i<len;i++){ cmp = s[(q+i)%len] - s[(p+i)%len]; if(cmp > 0){ //q>p return -1; } else if(cmp < 0){ //q<p return 1; } } return 0;//q == p } int main(){ int n; int len,ans;//len:字符串长度; ans:偏移量 char str[maxn]; scanf("%d", &n); while(n--){ scanf("%s", &str); len = strlen(str); for(int i=0;i<len;i++){ if(Less(str, len, i, ans) > 0) //如果i序列小,则换i ans = i; } // cout<<"Hi"<<endl;//test for(int i=0;i<len;i++){ //printf("%s", str[(ans+i)%len]);//为何此处会卡住? putchar(str[(ans+i)%len]); } } return 0; } /* 1 CCTC CCCT */
![QQ沟通交流群](https://blog-static.cnblogs.com/files/johnnyzen/cnblogs-qq-group-qrcode.gif?t=1679679148)
本文作者:
千千寰宇
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!