日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

拼凑 牛客练习赛70

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拼凑 牛客练习赛70 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:牛客網:

題目描述

牛牛還是很喜歡字符串"puleyaknoi"。

牛牛有T個超長超長的字符串,不過這次他更懶了,他希望直接在字符串中看見他喜歡的字符串。

如果一個子串中含有一個子序列是”puleyaknoi“,那么他就把這個子串稱作好的子串。

牛牛是個懶人,他不喜歡看太長的子串,那樣他會覺著眼鏡很累。

你能幫他求出對于每個字符串,最短的好的子串的長度是多少嗎?

如果沒有,請輸出-1。

輸入描述:

第一行一個T表示數據組數

接下來T行每行一個字符串(保證字符串只含小寫字母)

輸出描述:
共T行每行一個答案
示例1
輸入
復制

3 sxpuleyaaknoip pionkaayelupxs yydspwuwlwewywawkwnwowiw

輸出
復制

11 -1 19

備注:
T<=10,字符串長度不超過10^5T≤10,字符串長度不超過10
5

題解:

我一開始想的是在A題的基礎上改,A題是打亂順序,B題是找子串,子串其實就是相對位置已經固定,只是不一定靠著而已
我用A題作為模板改完后,意識到復雜度過高,肯定會TEL,決定換一個方式
用序列自動機來做,序列自動機專門來求子串問題,典型的空間換時間,
記錄每個位置往后最近的字母的位置
然后從p才是出發匹配我們所需要的子串

int nxt[maxn][30]; int now[30]; char s[maxn]; void init() {//序列自動機預處理memset(now, -1, sizeof now); //mow_i表示第i個字母在原串中從后向前最晚出現的位置int len = strlen(s);--len;for(int i = len; ~i; --i) //處理每一個字符{for(int j = 0; j < 26; ++j) //找出第i個字符后面的26個字母最早出現的字符的位置nxt[i][j] = now[j];now[s[i] - 'a'] = i; //用當前字符更新當前字符在原串中從后向前最晚出現的位置} }

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。