查询成绩

 

Accepted : 54
Submit : 280
Time Limit : 3000 MS
Memory Limit : 65536 KB

题目描述

波波同学是位大四的学生,同时也是一位考研er。为了考上北京邮电大学,他准备了很长时间。不久前,考研成绩终于公布了。波波登陆了成绩查询网站,发现自己密码竟然忘记了!但是幸好,他还记得其中的某些字母。请你判断,他记忆中的字母是否是正确密码的片段。

输入

多组样例,每组样例有两行。第一行为正确密码,第二行为波波记得的密码片段,'*'号表示波波不知道的密码片段,可能任意长,也可能为零。每行不超过110字符,首尾不会出现'*'。

输出

对于每组样例,能得到正确密码的输出yes,不能的输出no。

样例输入
abcdefg
ab*f
fnoeend
f*ed
ajfneogbb
aj*n*b

样例输出
yes
no
yes


#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;

char str[1200],cha[1200],pat[1200],next[1200];
int  sta;
void get_next( char *word )
{
    int len = strlen( word );
    int k = -1,j = 0; next[0] = -1;
    while( j < len )
    if( k == -1 || str[k] == str[j] )
         next[++j] = ++k;
    else k = next[k];
}
int work( char *word )
{
    int len = strlen( str );
    int let = strlen( word );
    int i,k = 0;
    for( i = sta; i < len; i++ )
    {
        while( str[i] != word[k] && next[k] != -1 ) k = next[k];
        if( str[i] == word[k] ) k++;
        if( k == let )return i+1;
    }
    return -1;
}
int main( )
{
    while( scanf("%s",&str) != EOF )
    {
       scanf("%s",&cha);
       int len = strlen( cha );  cha[len++] = '*';
       int k = 0; bool fell = false;  sta = 0;
       for( int i = 0; i < len; i++ )
       {
           if( cha[i] == '*' )
           {
               if( k == 0 )continue;
               pat[k] = '\0';  k = 0;
               get_next( pat );sta = work( pat );
               if( sta < 0 ){ fell = true;break; }
           }
           else pat[k++] = cha[i];
       }
       if( !fell )printf("yes\n");
       else       printf("no\n");
    }
    return 0;
}


我的尽然超时。。。0.0
# include<iostream>
# include<cstring>
 # include<cstdio>
 # include<cmath>
 using namespace std;
 const int maxn=110+5;
 char a[maxn];
 char s[maxn];
 int flag;
 int main()
 {
     while(scanf("%s%s",&a,&s))
     {
         flag=0;
       for(int i=0,j=0;s[i]!='\0';i++,j++)
       {
           if(s[i]!=a[j])
           {
               if( s[i]!='*')
               {
               cout<<"no"<<endl;flag=1;break;}
               else
               {
                   i++;
                   while(s[i]!=a[j]&&s[i]!=a[j+1])
                    j++;
               }
           }
       }
       if(flag==0)  cout<<"yes"<<endl;
       memset(a,'\0',sizeof(a));
       memset(s,'\0',sizeof(s));
     }
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值