#include<bits/stdc++.h>
using namespace std;
char s[2510];
int letter[30],y[2510];
int main()
{
int T,i,j,cnt,len,x,ansy,ysum,flag;
scanf("%d",&T);
while(T--)
{
scanf("%s",&s);
len=strlen(s);
memset(letter,0,sizeof(letter));
memset(y,0,sizeof(y));
x=0;
for(i=0;i<len;i++)
letter[s[i]-'a']++;
cnt=0;
for(i=0;i<len;i++)//查找第一个提前出线的字符
{
while(!letter[cnt])
cnt++;
if(s[i]-'a'==cnt)
letter[cnt]--;
else
{
x=i;
ysum=0;
for(j=i+1;j<len&&ysum<letter[cnt];j++)
{
if(s[j]-'a'==cnt)
y[ysum++]=j;
}
break;
}
}
ansy=y[0];
for(i=1;i<letter[cnt];i++)
{
flag=1;
for(j=1;j<ansy-x+1;j++)
{
if(s[ansy-j]>s[y[i]-j])//y[i]比ansy更优
{
ansy=y[i];
flag=0;
break;
}
else if(s[ansy-j]<s[y[i]-j])//若ansy比y[i]更优
{
flag=0;
break;
}
}
if(flag)//若之前的比较无法判断哪个最优
{
for(j=1;j<y[i]-ansy+1;j++)//继续向后比较
{
if(s[ansy+j]>s[y[i]-ansy+x-j])//若y[i]比ansy更优
{
ansy=y[i];
break;
}
else if(s[ansy+j]<s[y[i]-ansy+x-j])//若ansy比y[i]更优
break;
}
}
}
printf("%d %d\n",x,ansy);
}
}
51nod 1335 子序列翻转
最新推荐文章于 2021-03-05 21:35:52 发布
本文介绍了一种用于处理字符串的算法,该算法通过分析字符频率和位置信息来找出特定字符的最优出现位置。它首先扫描字符串以统计每个字符的出现次数,然后确定提前出现的字符,并在此基础上进一步处理以找到最优解。
2225

被折叠的 条评论
为什么被折叠?



