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