4685 -- 【模拟试题】DOG进游戏
Description
给定 个字符串,并给定一个长度为 的匹配串,请你判断在 个字符串中是否有一个字符串与给定的匹配串匹配(即在字符串中存在一段字符与匹配串完全相同)。
如果有能够匹配的字符串,则输出”My God.“如果不能匹配,则输出”My CS.“,然后输出最多能匹配的长度 (即匹配串最多的前x 位,从匹配串第一位开始到第x位)。
Input
第一行首先是一个正整数 ,表示字符串的个数。然后是一个字符串sp ,表示匹配串。
第二行到第n+1 行,每行有一个字符串si ,表示一个待匹配的字符串。
Output
如果能够完全匹配,则输出”My God.“(输出时不含引号)。
如果不能完全匹配,则第一行输出”My CS.“(输出时不含引号),
然后在第二行输出最多能匹配的长度 。
Sample Input
3 aadd
aaddc
aadqc
aabb
Sample Output
My God.
Hint
样例2:
输入:
5 aaaddc
aaad
aaddc
adc
cfbgd
aqqq
输出:
My CS.
Description
给定 个字符串,并给定一个长度为 的匹配串,请你判断在 个字符串中是否有一个字符串与给定的匹配串匹配(即在字符串中存在一段字符与匹配串完全相同)。
如果有能够匹配的字符串,则输出”My God.“如果不能匹配,则输出”My CS.“,然后输出最多能匹配的长度 (即匹配串最多的前x 位,从匹配串第一位开始到第x位)。
Input
第一行首先是一个正整数 ,表示字符串的个数。然后是一个字符串sp ,表示匹配串。
第二行到第n+1 行,每行有一个字符串si ,表示一个待匹配的字符串。
Output
如果能够完全匹配,则输出”My God.“(输出时不含引号)。
如果不能完全匹配,则第一行输出”My CS.“(输出时不含引号),
然后在第二行输出最多能匹配的长度 。
Sample Input
3 aadd
aaddc
aadqc
aabb
Sample Output
My God.
Hint
样例2:
输入:
5 aaaddc
aaad
aaddc
adc
cfbgd
aqqq
输出:
My CS.
4
字符串匹配,自然是KMP了,然而考的时候一脸懵逼,完全记不到了啊!
下面的超链接是转载,侵删。
这个用于介绍KMP算法,详细代码是自己写的。
/*
另:例题1: seek the name,seek the fame
solution(侵删)
例题2: power string
solution:见record
例题3: Oulipo
solution:见record.注意匹配成功的时候j无需归0,因为可以继续匹配,如aaaaaa;aa
*/
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
int next[150]={0},n,lens,lent,mx=0;
string s,t;
//next[i]--以i结尾的字符串前缀和后缀相同元素最大长度。
void getnxt(string t)//最好在纸上推一推
{
next[1]=0;//第一个字符没有前后缀,需要直接加初值
int j=0;
for(int i=2;i<=lent;i++)//第一个加了初值才能推得走。
{
while(j>0&&t[j+1]!=t[i])j=next[j];//向前寻找
if(t[j+1]==t[i])j++;
next[i]=j;
}
}
bool KMP(string s,string t)//s--模式串;t--主串。KMP得到第一次匹配的位置:i-lens+1
{
int j=0;//j--匹配数
for(int i=1;i<=lent;i++)
{
while(j>0&&s[j+1]!=t[i])j=next[j];//匹配不了,模式串向右滑动
if(s[j+1]==t[i])j++;//每次都要比较下一个字符。
mx=max(mx,j);//取最大匹配数
if(j==lens)return 1;//匹配数=模式串长度,匹配成功。
}
return 0;
}
int main(){
cin>>n;
cin>>s;
lens=s.length();
s=' '+s;
for(int i=1;i<=n;i++)
{
memset(next,0,sizeof(next));
cin>>t;
lent=t.length();
t=' '+t;
if(KMP(s,t))
{
puts("My God.");return 0;
}
}
puts("My CS.");
printf("%d\n",mx);
return 0;
}
/*
5 aaaddc
aaad
aaddc
adc
cfbgd
aqqq
*/