1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include<bits/stdc++.h> 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 }