马尔科夫单词链

来源:百度知道 编辑:UC知道 时间:2024/05/21 15:14:59
马尔科夫单词链

Time Limit:1000MS Memory Limit:65536K
Total Submit:13 Accepted:0

Description

ardon是一名谍报人员,最近他潜入了敌国某大臣的家中,并开始私阅他的信件。这个大臣为了保密,制造了很多假的信件,Gardon必须分辨出这些假的信件来。Gardon知道,他所制造的假信件全部是基于马尔科夫单词链的规律用机器生成的,信件具有如下规则:

1:以某两个单词为开头;
2:以某两个单词为结尾;
3:在信件中,两个单词将按马尔科夫单词链决定下一个单词。

比如:给如下马尔科夫单词链:

Gardon is => 开始
Gardon is => a
is a => clever
a clever => boy
clever boy => 结束

就会生成如下一句话 : Gardon is a clever boy.(标点是人手工添加上去的,不计在单词链规则内)
如果某两个单词可能出现多个后继单词,则机器会随机选择一个。这些后继单词每一个都算做一条规则。

现在Gardon拿到了一封信,他想知道,如果这封信是伪造的,那这封信中存在多少个马尔科夫单词链的规则呢?

Input

输入为信件正文,以文件结尾结束。注意文中不同的单词不会超过400个,每个单词的长度不会超过200。

Output

输出规则的个数,注意开始的规则和结束的规则也算在内。

Sample Input

Gardon is a clever boy

Sample Output

5

Source

imcpc 2nd

这是本人做的,你自己多看看吧#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct node
{
char word[15];
struct node *next;
}Wordlist;
int count=0; //全局变量,计算马尔科夫单词连规则的个数
Wordlist *Creatword() //创建节点,输入信件信息
{
char str[15];
Wordlist *L,*S,*R;
L=(Wordlist *)malloc(sizeof(Wordlist));
L->next=NULL;
R=L;
printf("请输入信件正文:\n");
scanf("%s",str);
while(str[0]!='#')
{
S=(Wordlist *)malloc(sizeof(Wordlist));
strcpy(S->word,str);
S->next=NULL;
R->next=S;R=S;
scanf("%s",str);
}
return L;
}
int Compare(Wordlist *L,char str1[],char str2[]) //比较函数
{
int flag=0; //信号标志,为1时表明比较成功
Wordlist *p;
p=L->next;
while(p->next!=NULL)
{
if(strcmp(p->word,str1)==0)
{
if(strcmp(p->next->word,str2)==0)
{count++;flag=1;} //比