最小标示法:给定一个字符串,不断将其最后一个字符放到开头,最终会得到n个字符串,称这n个字符串循环同构,这些字符串中字典序最小的一个,就是最小表示法
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define maxn 1000005 int len; int main(){ int t; cin>>t; while(t--){ char s[maxn<<1]={}; cin>>(s+1); len=strlen(s+1); for(int i=1;i<=len;i++) s[len+i]=s[i]; int j=2,i=1; while(i<=len && j<=len){ int k=0; while(s[i+k]==s[j+k] && k<len) k++; if(s[i+k]>s[j+k]) i=i+k+1; else j=j+k+1; if(i==j)j++; } cout<<min(i,j)<<‘\n‘; } }
下面是进阶指南的模板
int n=strlen(s+1); for(int i=1;i<=n;i++)s[n+i]=s[i]; int i=1,j=2,k; while(i<=n && j<=n){ for(k=0;k<=n;&&s[i+k]==s[j+k];k++); if(k==n)break; if(s[i+k]>s[j+k]) i=i+k+1; else j=j+k+1; if(i==j)j++; } ans=min(i,j);
原文地址:https://www.cnblogs.com/zsben991126/p/10471669.html
时间: 2024-10-16 14:08:13