拼凑 牛客练习赛70
生活随笔
收集整理的這篇文章主要介紹了
拼凑 牛客练习赛70
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
來源:牛客網:
題目描述
牛牛還是很喜歡字符串"puleyaknoi"。
牛牛有T個超長超長的字符串,不過這次他更懶了,他希望直接在字符串中看見他喜歡的字符串。
如果一個子串中含有一個子序列是”puleyaknoi“,那么他就把這個子串稱作好的子串。
牛牛是個懶人,他不喜歡看太長的子串,那樣他會覺著眼鏡很累。
你能幫他求出對于每個字符串,最短的好的子串的長度是多少嗎?
如果沒有,請輸出-1。
輸入描述:
第一行一個T表示數據組數
接下來T行每行一個字符串(保證字符串只含小寫字母)
輸出描述:
共T行每行一個答案
示例1
輸入
復制
輸出
復制
備注:
T<=10,字符串長度不超過10^5T≤10,字符串長度不超過10
5
題解:
我一開始想的是在A題的基礎上改,A題是打亂順序,B題是找子串,子串其實就是相對位置已經固定,只是不一定靠著而已
我用A題作為模板改完后,意識到復雜度過高,肯定會TEL,決定換一個方式
用序列自動機來做,序列自動機專門來求子串問題,典型的空間換時間,
記錄每個位置往后最近的字母的位置
然后從p才是出發匹配我們所需要的子串
查找時這樣
now = nxt[now][mark[pos++] - ‘a’];
從前向后找
代碼:
#include<bits/stdc++.h> const int INF=1e8+9; using namespace std; string s="puleyaknoi"; const int maxn=1e5+9; int nxt[100009][37]; int now[maxn]; int main() {int t;cin>>t;while(t--){string a;cin>>a;for (int i = 0; i < 26; i++) nxt[a.length()][i] = -1;for(int i=a.length()-1;i>=0;i--){for(int j=0;j<26;j++)nxt[i][j]=nxt[i+1][j];int w=a[i]-'a';nxt[i][w]=i;} int ann=INF;for(int i=0;i<a.length();i++){if(a[i]==s[0]){int time=nxt[i][s[0]-'a'];int pos=1;while(time!=-1&&pos<10){time=nxt[time][s[pos++]-'a'];}if(time!=-1&&pos==10)ann=min(ann,time-i+1);}}if(ann==INF)cout<<-1<<endl;else cout<<ann<<endl; }return 0; }總結
以上是生活随笔為你收集整理的拼凑 牛客练习赛70的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小鹏新车 X9 内饰官方细节图公布:号称
- 下一篇: 疾病预测和天气分析练习赛