Problem A:Serval 的俳句
题目要求:
输入文件:standard input
输出文件:standard output
时间限制:1 second
空间限制:512 megabytes
Serval 是加帕里幼儿园的新生。
Serval在俳句赏析大会上发现了一本神秘书卷,他想从中找出一句俳句。
具体来说,神秘书卷是一个仅包含小写英文字母的字符串S,你需要找到满足下列条件的S的一个子序列S'作为一句俳句:
S' 的长度 |S'| 恰好为 17:
S1,S,S3,S4,S为同一个字符:S,S,...,S11,S12为同一个字符:S13,Sia,S1s,S16.S17为同一个字符。
如果满足条件的子序列存在,则输出这个子序列。若存在多个满足条件的子序列,输出任意一个均
可。
如果不存在满足条件的子序列,则输出none。
我们称S是S的子序列,当且仅当S可以从S中删去任意数量的字符得到。注意S'的前5个字符、中间7个字符以及后 5 个字符可以为同一个字符,例如aaaaaaaaaaaaaaaaa,bbbbbcccccccbbbbb,dddddeeeeeeeeeeee 都是满足条件的。
输入格式
第一行,一个正整数|S|(1≤|S|≤106),表示字符串S的长度。
第二行,一个长度为|S|的仅包含小写字母的字符串S。
输出格式
共一行,如果满足条件的子序列存在,则输出这个子序列,否则输出none.
样例
11
standard input: lifeispiano
standard output:none
22
standard input: aaabaacccdccbcccaadaaa
standard output:aaaaacccccccaaaaa
思路:
本题首先我们要明白俳句的定义:即aaaaabbbbbbbccccc这种形式,前五个字母相同,中间七个字母相同,后五个字母相同,当然前中后的字母也可以为同一个字母。然后我们分析本题,首先我们要判断的是前五个字母,当判断的时候我们应该对该字符串进行从前往后的遍历且必须要确保它在大于等于5的时候停止遍历,这时候我们可以通过定义一个int数组,在通过每个小写字母所对应的ASCII码来记录,既然有了确保它何时停止的方法,接下来就是储存,我们可以通过定义一个空的string类型的字符不断往里面加入字符来达到保存的目的;
一 a-z的ASCII码
a:97 b:98 c:99 d:100................z:122
二 代码实现
1,准备工作
int n;//表示字符串的长度 const int N=1e6+5; char s[N];//一开始用来存在原始的字符 int flag=0;//为接下来判断是要输出完整的字符串还是输出none string ans=""; //存放目标字符 int num[130];//根据a-z的ASCII码所定义的空间2.是否前五个相同字符的判断
int n=0;cin>>n;for(int i=0;i<n;i++){cin>>s[i];}int t1=-1;while(t1<n){t1++;num[s[t1]]=num[s[t1]]+1;if(num[s[t1]]>=5){for(int i=0;i<5;i++){ans+=s[t1];}flag+=1;break;}} for(int i=0;i<130;i++){num[i]=0; }if(flag==0){cout<<"none"<<endl;return 0;}flag=0;注意:
该步骤最后的flag=0是为了下一步判断是输出完整的字符并保存还是输出none做准备。
同时每一次判断完之后的int数组必须全部归零,这是为了保证接下来出现相同的字符的时候我们能够正确的判断。
3.中间七个字符的判断
int t2=t1;while(t2<n-1){t2++;num[s[t2]]=num[s[t2]]+1;if(num[s[t2]]>=7){for(int i=0;i<7;i++){ans+=s[t2];}flag+=1;break;}}for(int i=0;i<130;i++){num[i]=0; }if(flag==0){cout<<"none"<<endl;return 0;}注意:这里的t2必须继承上面的t1,保证字符遍历顺序的正确。
4.最后五个字符的判断
int t3=t2;if(t3==n-1){cout<<"none"<<endl;return 0;}flag=0;while(t3<n){t3++;num[s[t3]]=num[s[t3]]+1;if(num[s[t3]]>=5){for(int i=0;i<5;i++){ans+=s[t3];}flag+=1;break;}}if(flag==0){cout<<"none"<<endl;return 0;}注意:该步骤与上述步骤略有不同,到这步的时候,我们不用急于寻找字符,而是要先判断t3与我们所定义的n的关系,看它是否相等,若相等则直接输出none,这一步的判断可以避免我们下一步因为超出空间范围所出现的错误。
总结
以上是生活随笔为你收集整理的Problem A:Serval 的俳句的全部内容,希望文章能够帮你解决所遇到的问题。