BSOJ 4685 DOG进游戏 回顾——KMP

来源:互联网 发布:伐木累软件 编辑:程序博客网 时间:2024/09/21 09:24
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.

4


字符串匹配,自然是KMP了,然而考的时候一脸懵逼,完全记不到了啊!

下面的超链接是转载,侵删。

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 aaaddcaaadaaddcadccfbgdaqqq*/



0 0
原创粉丝点击