NC211595. 拼凑
描述
牛牛还是很喜欢字符串"puleyaknoi"。
牛牛有T个超长超长的字符串,不过这次他更懒了,他希望直接在字符串中看见他喜欢的字符串。
如果一个子串中含有一个子序列是”puleyaknoi“,那么他就把这个子串称作好的子串。
牛牛是个懒人,他不喜欢看太长的子串,那样他会觉着眼镜很累。
你能帮他求出对于每个字符串,最短的好的子串的长度是多少吗?
如果没有,请输出-1。
输入描述
第一行一个T表示数据组数
接下来T行每行一个字符串(保证字符串只含小写字母)
输出描述
共T行每行一个答案
示例1
输入:
3 sxpuleyaaknoip pionkaayelupxs yydspwuwlwewywawkwnwowiw
输出:
11 -1 19
pypy3(pypy3.6.1) 解法, 执行用时: 153ms, 内存消耗: 34492K, 提交时间: 2020-09-25 19:38:46
n=int(input()) st='puleyaknoi' d={st[i]:i for i in range(10)} for i in range(n): s=input() m=len(s) ind=[-1]*10 ans=[(m+1)]*10 res=m+1 for j in range(m): if s[j] in d: ind[d[s[j]]]=j if s[j]!='p': if ans[d[s[j]]-1]!=(m+1): ans[d[s[j]]]=ans[d[s[j]]-1] if s[j]=='i': res=min(res,j-ans[-1]+1) else: ans[0]=j if res!=m+1: print(res) else: print(-1)
C++14(g++5.4) 解法, 执行用时: 50ms, 内存消耗: 1580K, 提交时间: 2020-10-17 16:02:26
#include<iostream> using namespace std; string a="puleyaknoi"; int main(){ int t; cin >> t; string s; while(t--){ cin >> s; int ans=1e6; for(int i = 0;i < s.length(); i++){ if(s[i]=='p'){ int len=1; for(int j=i+1;j<s.length();j++){ if(a[len]==s[j]){ len++; if(len==10){ ans = min(ans,j-i+1); } } } } } if(ans <= s.length()) cout << ans << endl; else cout << "-1" <<endl; } }
C++ 解法, 执行用时: 113ms, 内存消耗: 688K, 提交时间: 2021-07-17 15:17:39
#include<bits/stdc++.h> using namespace std; int main() { int n,i,j; string s="puleyaknoi"; cin>>n; while(n--) { string ch; int r,ans=1e5+7; cin>>ch; for(i=0;i<ch.length();i++) { int f=1,r=0; if(ch[i]==s[0]) { for(j=i+1;j<ch.length();j++) { if(ch[j]==s[f]) { f++; r=j; } if(f==s.length()) { ans=min(ans,r-i+1); } } } } if(ans==1e5+7) cout<<-1<<endl; else cout<<ans<<endl; } }
C(clang11) 解法, 执行用时: 21ms, 内存消耗: 400K, 提交时间: 2021-03-31 20:59:42
#include<stdio.h> char b[100005]; int main() { int i,j,k,l,n,m,t; scanf("%d",&t); char a[11]="puleyaknoi"; while(t--){ int min=99999; int p=1; scanf("%s",b); for(i=0;b[i]!='\0';i++){ if(b[i]=='p'){ for(j=i+1;b[j]!='\0';j++) if(b[j]==a[p]){ p++; if(p==10) break; } if(p==10&&j-i+1<min) min=j-i+1; if(b[i]=='\0') break; p=1; } } if(min==99999) printf("-1\n"); else printf("%d\n",min); } }