别再来这么多猫娘了!、紧急救援、链表去重
L1-101 别再来这么多猫娘了当然由于训练数据里并不区分道德或伦理倾向因此如果不加审查AI 会生成大量的、不一定符合社会公序良俗的内容。尽管关于这个问题仍有争论但至少在比赛中我们还是期望 AI 能用于对人类更有帮助的方向上少来一点猫娘。因此你的工作是实现一个审查内容的代码用于对 AI 生成的内容的初步审定。更具体地说你会得到一段由大小写字母、数字、空格及 ASCII 码范围内的标点符号的文字以及若干个违禁词以及警告阈值你需要首先检查内容里有多少违禁词如果少于阈值个则简单地将违禁词替换为censored如果大于等于阈值个则直接输出一段警告并输出有几个违禁词。输入格式:输入第一行是一个正整数 N (1≤N≤100)表示违禁词的数量。接下来的 N 行每行一个长度不超过 10 的、只包含大小写字母、数字及 ASCII 码范围内的标点符号的单词表示应当屏蔽的违禁词。然后的一行是一个非负整数 k (0≤k≤100)表示违禁词的阈值。最后是一行不超过 5000 个字符的字符串表示需要检查的文字。从左到右处理文本违禁词则按照输入顺序依次处理对于有重叠的情况无论计数还是替换查找完成后从违禁词末尾继续处理。输出格式:如果违禁词数量小于阈值则输出替换后的文本否则先输出一行一个数字表示违禁词的数量然后输出He Xie Ni Quan Jia!。输入样例1:5MaoNiangSeQingBaoLiWeiGuiBuHeShi4BianCheng MaoNiang ba! WeiGui De Hua Ye Keyi Shuo! BuYao BaoLi NeiRong.输出样例1:BianCheng censored ba! censored De Hua Ye Keyi Shuo! BuYao censored NeiRong.输入样例2:5MaoNiangSeQingBaoLiWeiGuiBuHeShi3BianCheng MaoNiang ba! WeiGui De Hua Ye Keyi Shuo! BuYao BaoLi NeiRong.输出样例2:3He Xie Ni Quan Jia!输入样例3:2AABB3AAABBB输出样例3:censoredAcensoredB输入样例4:2ABBB3AAABBB输出样例4:AAcensoredcensored输入样例5:2BBAB3AAABBB输出样例5:AAAcensoredBimport java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { static int N1100,idx,mod1000000007,r1,t1,r2,t2; static String forbid[]new String[N]; //qq public static void main(String []args) throws IOException{ //System.out.println(100); BufferedReader brnew BufferedReader(new InputStreamReader(System.in)); int nInteger.parseInt(br.readLine()); //String g[]br.readLine().split( ); for (int i 0; i n; i) { forbid[i]br.readLine(); } int kInteger.parseInt(br.readLine()); String textbr.readLine(); StringBuilder sbnew StringBuilder(text); char c1;//值为 1 的控制字符SOH ,ASCII 1 是一个控制字符不是可打印字符。 //在正常的用户输入如句子、文章、聊天记录中几乎不会出现 int cnt0;//违禁词数量 for (int j2 0; j2 n; j2) { //注意循环次序 违禁词一定在第一层 for (int i 0; i sb.length(); i){ if(iforbid[j2].length()sb.length()){ if(sb.substring(i, iforbid[j2].length()).equals(forbid[j2])){ cnt; sb.replace(i, iforbid[j2].length(), c); } } } } StringBuilder reStringBuildernew StringBuilder(); for (int i 0; i sb.length(); i) { char tsb.charAt(i); if(t1){ reStringBuilder.append(censored); }else{ reStringBuilder.append(t); } } if(cntk){ System.out.println(reStringBuilder.toString()); }else{ System.out.println(cnt); System.out.println(He Xie Ni Quan Jia!); } } }L2-001 紧急救援部分超时作为一个城市的应急救援队伍的负责人你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候你的任务是带领你的救援队尽快赶往事发地同时一路上召集尽可能多的救援队。输入格式:输入第一行给出4个正整数N、M、S、D其中N2≤N≤500是城市的个数顺便假设城市的编号为0 ~ (N−1)M是快速道路的条数S是出发地的城市编号D是目的地的城市编号。第二行给出N个正整数其中第i个数是第i个城市的救援队的数目数字间以空格分隔。随后的M行中每行给出一条快速道路的信息分别是城市1、城市2、快速道路的长度中间用空格分开数字均为整数且不超过500。输入保证救援可行且最优解唯一。输出格式:第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔输出结尾不能有多余空格。输入样例:4 5 0 320 30 40 100 1 11 3 20 3 30 2 22 3 2输出样例:2 600 1 3import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Arrays; import java.util.Stack; public class Main { static int N510,idx,mod1000000007; static int sos[]new int[N];//每个点救援队数量 static int fro[]new int[N];//存最短路径前提下的前驱 static int dis[]new int[N];//s到当前点最短距离 static int num[]new int[N];//s到当前点最短距离的条数 static int sum[]new int[N];//在最短路径下 到当前点的救援队的数量 static int we[][]new int[N][N];//用邻接矩阵存边 static boolean f[]new boolean[N];//标记该点是否被访问过了 即是否被升起 //qq public static void main(String []args) throws IOException{ //System.out.println(100); BufferedReader brnew BufferedReader(new InputStreamReader(System.in)); BufferedWriter bwnew BufferedWriter(new OutputStreamWriter(System.out)); String g[]br.readLine().split( ); int nInteger.parseInt(g[0]),mInteger.parseInt(g[1]),sInteger.parseInt(g[2]),dInteger.parseInt(g[3]); //String g[]br.readLine().split( ); gbr.readLine().split( ); for (int i 0; i n; i) { sos[i]Integer.parseInt(g[i]); } sum[s]sos[s]; for (int i 0; i n; i) { Arrays.fill(we[i], Integer.MAX_VALUE); we[i][i]0; } for (int i 0; i n; i) { dis[i]Integer.MAX_VALUE; } dis[s]0; num[s]1;//注意 Arrays.fill(fro, -1); for (int i 0; i m; i) { gbr.readLine().split( ); int aInteger.parseInt(g[0]),bInteger.parseInt(g[1]),wInteger.parseInt(g[2]); we[a][b]Math.min(we[a][b], w); we[b][a]we[a][b]; } Dijkstra(n); bw.write(num[d] sum[d]\n); bw.flush(); if(dis[d]!Integer.MAX_VALUE){ // StackInteger stacknew Stack(); // for (int i d; i !-1; ifro[i]) { // stack.add(i); // } // StringBuilder stringBuildernew StringBuilder(); // // while(!stack.isEmpty()){ // stringBuilder.append(stack.pop() ); // } // bw.write(stringBuilder.toString().trim()); // bw.flush(); printpath(s,d,d); } } static void printpath(int s,int d,int k){ if(ks){ System.out.print(s ); return; } printpath(s,d,fro[k]); if(kd)System.out.print(k); else System.out.print(k ); } static void Dijkstra(int n){ for (int i 0; i n; i) { int u-1,mindisInteger.MAX_VALUE; for (int j 0; j n; j) {//选择距离短的点 if(f[j]true)continue; if(dis[j]mindis){ uj;mindisdis[j]; } } if(u-1)return; f[u]true; for (int j 0; j n; j) { if(f[j]true)continue; if(we[u][j]!Integer.MAX_VALUE){ if(dis[j]dis[u]we[u][j]){ dis[j]dis[u]we[u][j]; fro[j]u; sum[j]sum[u]sos[j]; num[j]num[u]; }else if(dis[j]dis[u]we[u][j]){ num[j]num[u]; if(sum[j]sum[u]sos[j]){ sum[j]sum[u]sos[j]; fro[j]u; } } } } } } }L2-002 链表去重部分超时给定一个带整数键值的链表 L你需要把其中绝对值重复的键值结点删掉。即对每个键值 K只有第一个绝对值等于 K 的结点被保留。同时所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15你需要输出去重后的链表 21→-15→-7还有被删除的链表 -15→15。输入格式输入在第一行给出 L 的第一个结点的地址和一个正整数 N≤105为结点总数。一个结点的地址是非负的 5 位整数空地址 NULL 用 −1 来表示。随后 N 行每行按以下格式描述一个结点地址 键值 下一个结点其中地址是该结点的地址键值是绝对值不超过104的整数下一个结点是下个结点的地址。输出格式首先输出去重后的链表然后输出被删除的链表。每个结点占一行按输入的格式输出。输入样例00100 599999 -7 8765423854 -15 0000087654 15 -100000 -15 9999900100 21 23854输出样例00100 21 2385423854 -15 9999999999 -7 -100000 -15 8765487654 15 -1import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class Main { static int N100010,mod1000000007; static int e[]new int[N]; static int ne[]new int[N]; static int h[]new int[N]; //static boolean f[]new boolean[N];//true表示在一组 false表示在重复组 //qq public static void main(String []args) throws IOException{ //System.out.println(100); BufferedReader brnew BufferedReader(new InputStreamReader(System.in)); BufferedWriter bwnew BufferedWriter(new OutputStreamWriter(System.out)); String g[]br.readLine().split( ); int headInteger.parseInt(g[0]);int nInteger.parseInt(g[1]); //String g[]br.readLine().split( ); SetInteger setnew HashSet(); for (int i 0; i n; i) { gbr.readLine().split( ); int addInteger.parseInt(g[0]),aInteger.parseInt(g[1]),nextInteger.parseInt(g[2]); e[add]a; ne[add]next; } ArrayListInteger arrayList1new ArrayList(); ArrayListInteger arrayList2new ArrayList(); for (int i head; i ! -1; ine[i]) { int ue[i]; if(!set.contains(Math.abs(u))){ set.add(Math.abs(u)); arrayList1.add(i); }else{ arrayList2.add(i); } } for (int i 0; i arrayList1.size(); i) { int addrearrayList1.get(i); System.out.printf(%05d %d ,addre,e[addre]); if(iarrayList1.size()-1)System.out.println(-1); else System.out.printf(%05d\n,arrayList1.get(i1)); } for (int i 0; i arrayList2.size(); i) { int addrearrayList2.get(i); System.out.printf(%05d %d ,addre,e[addre]); if(iarrayList2.size()-1)System.out.println(-1); else System.out.printf(%05d\n,arrayList2.get(i1)); } } }