1 #define _CRT_SECURE_NO_WARNINGS 1
2 #include
3 char str[100][40];
4 char s[1005];
5
6 int remark[2000][2] = { 0 };
7 /*第一行为一个整数 n,表示违禁词库有 n(1≤n≤100) 个。
8 第 2 行到第 n+1 行,每行有一个字符串 s (2≤|s|≤30) 表示违禁词,且均为小写字母。
9 第 n+2 行是一个字符串 t (2≤|t|≤1000),表示Keichi需要发送的信息,也均为小写字母。
10 其中 |s| 表示字符串 s 的长度。*/
11
12 int main()
13 {
14 int n;
15 scanf("%d", &n);
16 for (int i = 0; i < n; i++) {
17 scanf("%s", str[i]);
18 }//type in banned words
19 scanf("%s", s);//type in a long word jugded
20 int len = strlen(s),k=0;//获得总长度
21
22
23 for (int i = 0; i < n; i++) {//对每一个违禁词进行判断
24 int length = strlen(str[i]);//获得违禁词长度
25 int cnt = 0;//初始化已判断过的长度
26 int flag = 1,start=0,end=0;//打星号的标记,若为真一直为1
27 for (int j = 0; j < len;) {//对长串从头到尾进行判断
28
29 start = j;//记录开始的位置
30 while (s[j] == str[i][cnt] && s[j] != '\0' && cnt != length) {
31 cnt++;
32 j++;
33 flag = 1;
34 }
35
36 end = j;//标记结束的位置
37 if (!cnt || flag) { j=start+1; flag = 0; }
38 if (cnt < length) {
39 end = start;
40 }
41
42 //把那一段划掉
43 if (end - start > 0) {
44 remark[k][0] = start;
45 remark[k][1] = end;
46 k++;
47 //printf("[%d,%d]\n", start, end);
48 }//记录所在的区间
49 cnt = 0;
50
51 }
52 }
53 for (int i = 0; i < k; i++) {
54 for (int j = *(*(remark+i)+0); j < *(*(remark + i) + 1); j++) {
55 s[j] ='*';
56 }
57 }
58 printf("%s\n", s);
59 int cnt = 0;
60 for (int i = 0; i < len; i++) {
61 while (s[i] == '*'&&cnt<2) {
62 printf("%c", s[i]);
63 cnt++;
64 }
65 if (s[i] == '*' && cnt == 2) {
66 continue;
67 }
68 printf("%c", s[i]);
69 cnt = 0;
70 }
71 printf("\n");
72 return 0;
73 }