【題解】POJ 1509 Glass Beads 最小表示法模板
阿新 • • 發佈:2019-01-12
ostream 字母 void stream ldr fine clu 輸出 ring
vjudge
題目大意TLDR
有$n$個首尾相接的字符串,每個字符串均由小寫字母構成,要求在環上找到一個斷點,使得斷開後所得的字符串字典序最小。
若有多處斷點斷開所得的字符串相同,則輸出位置最小的斷點
Solution
應該就是一個最小表示法的板子題,不多寫了
環還是經典的雙倍長度處理方法
#include <cstdio> #include <algorithm> #include <cstdlib> #include <cstring> #include <iostream> #include <cmath> #definemaxlen 10005 using namespace std; int n; int len; char str[maxlen<<1]; void Work() { len=strlen(str); memcpy(str+len,str,len); register int i=0,j=1,k=0; while(i<len && j<len && k<len) { if(str[i+k]==str[j+k]) ++k;else if(str[i+k]>str[j+k]) i=i+k+1,k=0; else if(str[i+k]<str[j+k]) j=j+k+1,k=0; if(i==j) ++j; } printf("%d\n",min(i,j)+1); } int main() { scanf("%d",&n); while(n--) { scanf("%s",str); Work(); }return 0; }
【題解】POJ 1509 Glass Beads 最小表示法模板