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 的俳句的全部內容,希望文章能夠幫你解決所遇到的問題。