#include
#include
#include
#include
#include |
#include "eprintf.h"
liệt kê
{
NPREF = 2,
NHASH = 4093,
TỐI ĐA = 10000
};
định nghĩa kiểu
cấu trúc
Nhà nước Nhà nước;
định nghĩa kiểu
cấu trúc
Hậu tố Hậu tố;
cấu trúc
Tình trạng {
char
*pref[NPREF];
Hậu tố *suf;
Trạng thái *tiếp theo;
};
cấu trúc
Hậu tố {
char
*từ;
Hậu tố *next;
};
Trạng thái *tra cứu(
char
*tiền tố[],
số nguyên
tạo nên);
vô hiệu
xây dựng(
char
*tiền tố[],
TÀI LIỆU
*);
vô hiệu
phát ra(
số nguyên
từ);
vô hiệu
thêm vào(
char
*tiền tố[],
char
*từ);
Trạng thái *statetab[NHASH];
char
KHÔNG TỪ[] =
"\N"
;
số nguyên
chủ yếu(
vô hiệu
)
{
số nguyên
tôi, nwords = MAXGEN;
char
*tiền tố[NPREF];
số nguyên
c;
dài
hạt giống;
đặt tên chương trình(
"markov"
);
hạt giống =
thời gian
(VÔ GIÁ TRỊ);
srand
(hạt giống);
vì
(i = 0; i < NPREF; i++)
prefix[i] = KHÔNG PHẢI TỪ;
xây dựng(tiền tố, stdin);
thêm(tiền tố, KHÔNG PHẢI TỪ);
tạo ra(nwords);
trở lại
0;
}
hằng số
số nguyên
SỐ NHÂN = 31;
chưa ký
số nguyên
băm(
char
*s[NPREF])
{
chưa ký
số nguyên
h;
chưa ký
char
*P;
số nguyên
Tôi;
h = 0;
vì
(i = 0; i < NPREF; i++)
vì
(p = (không dấu
char
*) s[i]; *p !=
'\0'
; p++)
h = HỆ SỐ * h + *p;
trở lại
h % NHASH;
}
Tra cứu trạng thái*
char
*tiền tố[NPREF],
số nguyên
tạo nên)
{
số nguyên
tôi, h;
Trạng thái *sp;
h = băm(tiền tố);
vì
(sp = statetab[h]; sp != NULL; sp = sp->next) {
vì
(i = 0; i < NPREF; i++)
nếu như
(
strcmp
(tiền tố[i], sp->pref[i]) != 0)
phá vỡ
;
nếu như
(tôi == NPREF)
trở lại
sp;
}
nếu như
(tạo nên) {
sp = (Trạng thái *) emalloc(
kích thước của
(Tình trạng));
vì
(i = 0; i < NPREF; i++)
sp->pref[i] = tiền tố[i];
sp->suf = NULL;
sp->next = statetab[h];
statetab[h] = sp;
}
trở lại
sp;
}
vô hiệu
addsuffix(State *sp,
char
*hậu tố)
{
Hậu tố *suf;
suf = (Hậu tố *) emalloc(
kích thước của
(Hậu tố));
suf->word = hậu tố;
suf->tiếp theo = sp->suf;
sp->suf =suf;
}
vô hiệu
thêm vào(
char
*tiền tố[NPREF],
char
*hậu tố)
{
Trạng thái *sp;
sp = tra cứu(tiền tố, 1);
thêm hậu tố (sp, hậu tố);
ghi nhớ di chuyển
(tiền tố, tiền tố+1, (NPREF-1)*
kích thước của
(tiền tố[0]));
tiền tố[NPREF-1] = hậu tố;
}
vô hiệu
xây dựng(
char
*tiền tố[NPREF],
TÀI LIỆU
*f)
{
char
buf[100], fmt[10];
chạy nước rút
(fmt,
"%%%%"
,
kích thước của
(bổ sung)-1);
trong khi
(
fscanf
(f, fmt, buf) != EOF)
thêm(tiền tố, estrdup(buf));
}
vô hiệu
phát ra(
số nguyên
từ n)
{
Trạng thái *sp;
Hậu tố *suf;
char
*tiền tố[NPREF], *w;
số nguyên
tôi, nmatch;
vì
(i = 0; i < NPREF; i++)
prefix[i] = KHÔNG PHẢI TỪ;
vì
(i = 0; i < n từ; i++) {
sp = tra cứu(tiền tố, 0);
nếu như
(sp == NULL)
bản in điện tử
"lỗi nội bộ: tìm kiếm không thành công"
);
nmatch = 0;
vì
(suf = sp->suf; suf != NULL; suf = suf->next)
nếu như
(
rand
() % ++nmatch == 0)
w = suf->từ;
nếu như
(nmatch == 0)
bản in điện tử
"lỗi nội bộ: không có hậu tố %d %s"
, i, tiền tố[0]);
nếu như
(
strcmp
(w, KHÔNG PHẢI TỪ) == 0)
phá vỡ
;
inf
(
"%s\n"
, TRONG);
ghi nhớ di chuyển
(tiền tố, tiền tố+1, (NPREF-1)*
kích thước của
(tiền tố[0]));
tiền tố[NPREF-1] = w;
}
}
Tôi là một lập trình viên xuất sắc, rất giỏi!