1071: zdw的嘤嘤嘤
时间限制: 1 Sec 内存限制: 128 MB提交: 52 解决: 13
[ 提交][ 状态][ 讨论版]
题目描述
//感觉会被zdw揍
众所周知,zdw是一个萌妹,喜欢嘤嘤嘤。而且最擅长八重嘤和嘤雄不朽。
这一天zdw说了一个很长的字符串,只包括 ‘y’ , ‘i’ , ‘n’ ,’g’这四个字符。你需要选取尽量多的下标,让这些下标在这个字符串中对应的字符按下标从小到大的顺序组起来是一个”yyyyiiinngggg”这样的字符串。其中’y’,’i’,’n’,’g’这些字符的个数为0也算是合法的。比如”yngg”和”g”都是合法的答案
现在cy想知道,最多能选多少下标,令其合法?
输入数据:
第一行一个T,表示有T组数据
T行每行一个字符串,只包含’y’, ’i’ , ’n’ , ’g’这四个小写字母
输出:
T行每行一个整数,代表最多能选取多少下标。
数据范围
T<=10
对于30%的数据:|s|<=10;
对于另10%的数据:只包含一种字母,|s|<=100000;
对于100%的数据:|s|<=100000
样例1:
INPUT
1
ygniyging
OUTPUT
5
样例2:
INPUT
2
y
ing
OUTPUT
1
3
输入
输出
提示
来源
思路:
可以用4个变量y,yi,yin,ying维护最大前缀。遍历字符串时,如果str[i]='n',则yin++;最后更新一下以yin为前缀的变量即可。
此题遍历时用i<strlen(str)会超时,可以改成str[i]。
代码:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
#define inf 0x3f3f3f3f
int n;
char str[MAXN];
int main()
{
scanf("%d",&n);
while(n--)
{
scanf("%s",str);
int y=0,yi=0,yin=0,ying=0;
for(int i=0;str[i];i++)
{
if(str[i]=='y') y++;
else if(str[i]=='i') yi++;
else if(str[i]=='n') yin++;
else if(str[i]=='g') ying++;
yi=max(yi,y);
yin=max(yin,yi);
ying=max(ying,yin);
}
printf("%d\n",ying);
}
return 0;
}