#include<bits/stdc++.h>
using namespace std;
const int N=5005;
//最搞5005?!
char b[2*N],ans[N];
int main(){
ios::sync_with_stdio(0);
//加速?!
cin.tie(0);
//加速?!
cout.tie(0);
//加速?!
string a;
cin>>a;
int n=a.size();
for(int i=0;i<n;i++){
//扩倍?!
b[i+1]=a[i];
//从一开始存储?!
b[n+i+1]=a[i];
//在后面存储一边同样的b,方便枚举?!
}
for(int i=1;i<=n;i++)
ans[i]=b[i];
//存储前n个?!
for(int i=2;i<=n;i++){
bool fl=0;
for(int j=0;j<n;j++){
char a1=b[i+j];
//尾巴?!
char a2=ans[j+1];
//首 ?!
if(a1<a2){
//首小尾?!
fl=1;
//标记?!
break;
//回回?!
}
if(a1>a2){
//否否?!
break;
//回回?!
}
}
if(fl){
//小小?!
for(int j=0;j<n;j++)
ans[1+j]=b[i+j];
//大安?!
}
}
for(int i=1;i<=n;i++)
cout<<ans[i];
//输出大安?!
return 0;
}//douzhichupinbishijingpin
#include<bits/stdc++.h>
#include<map>
using namespace std;
const int a=1005;
const int b=1005;
int c[a][b];
int d[a];
int e[2][b][a];
map<int,int> f;
int g;
int h[b],i[b*b],j[b*b],k[b*b],l;
void m(int n,int o,int p) {
l++;
j[l]=o;
k[l]=p;
i[l]=h[n];
h[n]=l;
}
int q(int r) {
if(f.find(r)==f.end()) {
f[r]=++g;
}
return f[r];
}
int main() {
freopen("polygon.in","r",stdin);
freopen("polygon.out","w",stdout);
int n,s,t;
cin>>n>>s>>t;
for(int u=1; u<=n; u++) {
cin>>d[u];
for(int v=1; v<=d[u]; v++) {
cin>>c[u][v];
q(c[u][v]);
}
}
memset(h,-1,sizeof(h));
for(int u=1; u<=n; u++) {
for(int v=1; v<=d[u]; v++) {
int w=q(c[u][v]);
for(int x=v+1; x<=d[u]&&x-v+1<=s; x++) {
int y=q(c[u][x]);
m(w,y,u);
}
}
}
while(t--) {
int r,z;
cin>>r>>z;
int aa=q(z);
memset(e,0,sizeof(e));
for(int u=1; u<=n; u++) {
for(int v=1; v<=d[u]; v++) {
if(c[u][v]!=1)continue;
for(int bb=v+1; bb<=d[u]&&bb-v+1<=s; bb++) {
int cc=q(c[u][bb]);
e[1][cc][u]=1;
}
}
}
if(r==1) {
bool dd=false;
for(int u=1; u<=n; u++) {
if(e[1][aa][u]) {
dd=true;
}
}
if(dd) {
cout<<"Yes"<<'\n';
} else {
cout<<"No"<<'\n';
}
continue;
}
int ee=1;
int ff=2*n+5;
if(r<ff) {
ff=r;
}
bool gg=false;
for(int hh=2; hh<=ff; hh++) {
int ii=ee^1;
memset(e[ii],0,sizeof(e[ii]));
for(int jj=1; jj<=g; jj++) {
for(int kk=1; kk<=n; kk++) {
if(!e[ee][jj][kk])continue;
for(int ll=h[jj]; ll!=-1; ll=i[ll]) {
int mm=j[ll];
int nn=k[ll];
if(nn==kk)continue;
e[ii][mm][nn]=1;
}
}
}
ee=ii;
if(hh==r) {
for(int u=1; u<=n; u++) {
if(e[ee][aa][u]) {
gg=true;
}
}
break;
}
}
if(r<=ff) {
if(gg) {
cout<<"Yes"<<'\n';
} else {
cout<<"No"<<'\n';
}
} else {
bool oo=false;
for(int u=1; u<=n; u++) {
if(e[ee][aa][u]) {
oo=true;
}
}
if(oo) {
cout<<"Yes"<<'\n';
} else {
cout<<"No"<<'\n';
}
}
}
return 0;
}
```c++
#include<bits/stdc++.h>
using namespace std;
const int N=3000005;
int n,k,a[N],P[N],S[N],q[N];//P[i]=Σ(a[j]-1),S[i]=Σa[j],q:单调队列存下标
bool chk(int len){//判断是否存在长度len的窗口内每天都能吃到鱼
if(len==0)return true;
int h=0,t=0;
for(int i=1;i<=len;i++){//初始化窗口[1,len]的单调队列(按P递增)
while(h<t&&P[q[t-1]]>=P[i])t--;
q[t++]=i;
}
for(int L=1;L+len-1<=n;L++){//滑动窗口
int R=L+len-1;
if(L>1){//加入R,弹出过期下标
while(h<t&&P[q[t-1]]>=P[R])t--;
q[t++]=R;
while(h<t&&q[h]<L)h++;
}
int I=S[L-1]-S[max(0,L-k-1)];//[L-k,L-1]内能覆盖到L的鱼数
if(P[q[h]]+I>=P[L-1])return true;//minP+I>=P[L-1]即可行
}
return false;
}
int main(){
freopen("fish.in","r",stdin);
freopen("fish.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
S[i]=S[i-1]+a[i];
P[i]=P[i-1]+a[i]-1;
}
int l=0,r=n,ans=0;
while(l<=r){//二分答案
int m=(l+r)/2;
if(chk(m)){ans=m;l=m+1;}
else r=m-1;
}
printf("%d\n",ans);
return 0;
}