ZOJ 1729 Hidden Password (字符串最小表示)
以前听过,不知道是什么,其实就是字符串首尾相连成一个环,n种切法求一个字典序最小的表示。
朴素算法大家都懂。O(n)的算法代码非常简单,最主要的思想是失配的时候尽可能大的移动指针。
另外附上一个不错的字符串算法总结:http://duanple.blog.163.com/blog/static/709717672009825004092/
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5+5; char s[maxn]; int main() { //freopen("in.txt","r",stdin); int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); scanf("%s",s); int i = 0,j = 1, k = 0; while(i<n && j<n && k<n){ int x = (i+k)%n, y = (j+k)%n; if(s[x] != s[y]){ if(s[x] > s[y]) i += k+1;//如果不移动到这里,另外一边一定存在一个更小的前缀 else j += k+1; k = 0; }else k++; if(i == j) j++; } printf("%d\n",i); } return 0; }