1 #include<bits/stdc++.h> 2 char str[100][40]; 3 char s[1005]; 4 5 int remark[2000][2] = { 0 }; 6 /*第一行为一个整数 n,表示违禁词库有 n(1≤n≤100) 个。 7 第 2 行到第 n+1 行,每行有一个字符串 s (2≤|s|≤30) 表示违禁词,且均为小写字母。 8 第 n+2 行是一个字符串 t (2≤|t|≤1000),表示Keichi需要发送的信息,也均为小写字母。 9 其中 |s| 表示字符串 s 的长度。*/ 10 int main() 11 { 12 int n; 13 scanf("%d", &n); 14 for (int i = 0; i < n; i++) { 15 scanf("%s", str[i]); 16 }//type in banned words 17 scanf("%s", s);//type in a long word that jugded 18 int len = strlen(s),k=0;//获得总长度 19 20 21 for (int i = 0; i < n; i++) {//对每一个违禁词进行判断 22 int length = strlen(str[i]);//获得违禁词长度 23 int cnt = 0;//初始化已判断过的长度 24 int flag = 1,start=0,end=0;//打星号的标记,若为真一直为1 25 for (int j = 0; j < len;) {//对长串从头到尾进行判断 26 27 start = j;//记录开始的位置 28 while (s[j] == str[i][cnt] && s[j] != '\0' && cnt != length) { 29 cnt++; 30 j++; 31 flag = 1; 32 } 33 34 end = j;//标记结束的位置 35 if (!cnt || flag) { j=start+1; flag = 0; } 36 if (cnt < length) { 37 end = start; 38 } 39 40 //把那一段划掉 41 if (end - start > 0) { 42 remark[k][0] = start; 43 remark[k][1] = end; 44 k++; 45 //printf("[%d,%d]\n", start, end); 46 }//记录所在的区间 47 cnt = 0; 48 49 } 50 } 51 for (int i = 0; i < k; i++) { 52 for (int j = *(*(remark+i)+0); j < *(*(remark + i) + 1); j++) { 53 s[j] ='*'; 54 } 55 } 56 //printf("%s\n", s); 57 int cnt = 0; 58 for (int i = 0; i < len; i++) { 59 while (s[i] == '*'&&cnt<2) { 60 printf("%c", s[i]); 61 cnt++; 62 } 63 if (s[i] == '*' && cnt == 2) { 64 continue; 65 } 66 printf("%c", s[i]); 67 cnt = 0; 68 } 69 printf("\n"); 70 return 0; 71 }
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现