您的位置:首页 > 理论基础 > 计算机网络

HDU 5007 Post Robot KMP (ICPC西安赛区网络预选赛 1001)

2014-09-14 21:57 525 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5007

解题报告:输入一篇文章,从头开始,当遇到 “Apple”, “iPhone”, “iPod”, “iPad” 这几个字符串时,输出”MAI MAI MAI!“,当遇到"Sony"时,输出“SONY DAFA IS GOOD!"。

看题太渣,题目意思还有个每个单词最多只出现一次关键词。有了这个条件就简单了,只要分别对每个单词进行五次KMP,匹配到了就输出对应的解释。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char str[1000000];
int next[1000000];
void get_next(char* s,int* next)
{
int len = strlen(s);
int i = -1,j = 0;
memset(next,0,sizeof(next));
next[0] = 0;
while(j < len)
{
if(i < 0 || s[i] == s[j])
{
i++;
next[j+1] = i;
}
else i = 0;
j++;
}
}
int kmp(char* s,char* t,int* next)
{
get_next(t,next);
int lens = strlen(s);
int lent = strlen(t);
int i = 0,j = 0;
while(i < lens && j < lent)
{
if(s[i] == t[j]) j++;
else j = next[j];
i++;
//    printf("%d %d\n",i,j);
}
if(j == lent) return i - lent;  //匹配成功返回开始配对的位置
else return -1;   //匹配失败,返回尾指针
}
char temp[6][20] = {"Apple","iPhone","iPod","iPad","Sony"};
int main()
{
while(scanf("%s",str)!=EOF)
{
if(kmp(str,temp[0],next)!=-1) puts("MAI MAI MAI!");
if(kmp(str,temp[1],next)!=-1) puts("MAI MAI MAI!");
if(kmp(str,temp[2],next)!=-1) puts("MAI MAI MAI!");
if(kmp(str,temp[3],next)!=-1) puts("MAI MAI MAI!");
if(kmp(str,temp[4],next)!=-1) puts("SONY DAFA IS GOOD!");
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: