大家好!
其实我是来存模板的。。
题目链接:http://cstest.scu.edu.cn/soj/problem.action?id=3296
题意:
在一个字符串的各循环表示中,
输出字典序最小的一个
算法:
最小表示法,
可以参考周源的《浅析“最小表示法”思想在字符串循环同构问题中的应用》
代码如下:
#include<cstdio> #include<iostream> #include<algorithm> #include<sstream> #include<cstdlib> #include<cstring> #include<string> #include<climits> #include<cmath> #include<queue> #include<vector> #include<stack> #include<set> #include<map> #define INF 0x3f3f3f3f #define eps 1e-8 using namespace std; const int MAXN=110000; char a[MAXN]; int main() { int cas; scanf("%d",&cas); while(cas--) { scanf("%s",a); int n=strlen(a); int ans; for(int i=0,j=1,k=0; k<n && j+k<2*n; ) { if(a[(i+k)%n]>a[(j+k)%n]) { i=max(i+k+1,j); j=i+1; k=0; } else if(a[(i+k)%n]<a[(j+k)%n]) { j=j+k+1; k=0; } else { k++; } ans=i; } for(int i=0; i<n; i++) { printf("%c",a[(ans+i)%n]); } puts(""); } return 0; }