列表

详情


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);
	}
}

上一题