1. 程式人生 > >【題解】POJ 1509 Glass Beads 最小表示法模板

【題解】POJ 1509 Glass Beads 最小表示法模板

ostream 字母 void stream ldr fine clu 輸出 ring

vjudge

題目大意TLDR

有$n$個首尾相接的字符串,每個字符串均由小寫字母構成,要求在環上找到一個斷點,使得斷開後所得的字符串字典序最小。

若有多處斷點斷開所得的字符串相同,則輸出位置最小的斷點

Solution

應該就是一個最小表示法的板子題,不多寫了

環還是經典的雙倍長度處理方法

#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <cmath>
#define
maxlen 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 最小表示法模板