题目描述

kkksc03是个非凡的空想家!在短时间内他设想了大量网页,然后总是交给可怜的lzn去实现。

洛谷的网页端,有很多文件夹,文件夹还套着文件夹。

例如:/luogu/application/controller表示根目录下有一个名称为luogu的文件夹,这个文件夹下有一个名称application的文件夹,其中还有名为controller的文件夹。

每个路径的第1个字符总是’/’,且没有两个连续的’/’,最后的字符不是’/’。所有名称仅包含数字和小写字母。

目前根目录是空的。kkksc03想好了很多应该有的文件夹路径名。问题是,需要是使这些文件夹都存在,需要新建几个文件夹呢?

输入输出格式

输入格式:

输入文件第1行为一个正整数N。

接下来N行,每行为一个描述路径的字符串,长度均不超过100。

输出格式:

输出应包含N行,每行1个正整数,第i行输出若要使第1个路径到第i个路径存在,最少需要新建多少个文件夹。

输入样例#1:

2

/luogu/application/controller

/luogu/application/view

输出样例#1:

3

4

输入样例#2:

3

/chicken

/chicken/egg

/chicken

输出样例#2:

1

2

2

输入样例#3:

4

/a

/a/b

/a/c

/b/b

输出样例#3:

1

2

3

5

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner; public class 洛谷的文件夹 {
public static void main(String[] args) {
int count=0; //计算新建文件夹次数
Scanner sc =new Scanner(System.in);
ArrayList<String> list = new ArrayList<String>();
ArrayList<String> list1 = new ArrayList<String>();
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
String s = sc.next();
list.add(s); //把每一个路径都保存为String放入list里面
}
Collections.sort(list); //把这些路径按照字典序排序
//排完序就会把相同路径或者相似路径的放在一起 可以比对这一个和下一个的不同来计算
//不用再去记录以前建过的文件夹
String sss = list.get(0);
String [] num3 = sss.substring(1).split("/");
for (int i = 0; i < num3.length; i++) {
list1.add(num3[i]);
count++;
} //先把第一个保存下来
for (int i = 0; i <list.size()-1; i++) {
System.out.println(count);
String s = list.get(i);
String ss = list.get(i+1);
String [] num1 = s.substring(1).split("/"); //这里是为了拆分使用,来匹配相对位置的文件夹是不是被建过
String [] num2 = ss.substring(1).split("/");
int min = Math.min(num1.length, num2.length);//保存最小长度的
int temp=-1; //这里是用第一个当基础来与第二个的比较
if(num1.length<num2.length){ //如果第二个长度大,就先保存一下
temp=num1.length;
}
for (int j = 0; j < min; j++) {
if (num1[j].equals(num2[j])) { //第一个相同
if (!list1.contains(num1[j])) { // list1 这里是list1 看看是否有这个文件夹
count++; //这里主要是 看看这两个路径里有几个相同的 防止加上相同的文件夹
list1.add(num1[j]); //没有就加上这个文件夹 count记录次数
}
}
else { //如果这两个不相等
temp=j; //就保存下标 结束掉
break;
}
}
if (temp!=-1) { //如果有不相同的 或者第二个数组长的
list1 = new ArrayList<String>(); //list清空 重新录入
for (int j = 0; j < num2.length; j++) { //前面第一个已经录好了 这里录入第二个
list1.add(num2[j]);
if(j>=temp){ //当录入到下标的地方,就开始添加次数
count++;
}
}
} }
System.out.println(count);
}
}

最新文章

  1. Yii 2.x RESTful 应用 - 类图
  2. UIScrollView解决无法触发手势
  3. iOS 系统消息
  4. UITableView编辑
  5. poj 2311
  6. opencv人脸检测分类器训练小结
  7. Oracle分页查询语句的写法(转)
  8. QMessageBox 弹出框上的按钮设置为中文
  9. strip, 关于去除目标文件种的不必要信息
  10. C语言预处理指令
  11. IOS学习笔记06---C语言函数
  12. [Swust OJ 409]--小鼠迷宫问题(BFS+记忆化搜索)
  13. word 一些有用的技巧
  14. 阿里云部署SSL证书详解
  15. 基于 React + Webpack 的音乐相册项目(下)
  16. [AHOI 2005]COMMON 约数研究
  17. Ubuntu Desktop: 备份与还原
  18. Confluence 6 workbox 通知包含了什么
  19. u3d fpsCounter
  20. 解决Android 6.0(api 23) SDK,不再提供org.apache.http.*

热门文章

  1. [hdu4576]dp
  2. springMVC的自定义annotation(@Retention@Target)详解
  3. PAT数列排序
  4. JS理论-:一只tom猫告诉你构造函数 实例 实例原型 实例原型的实例原型是什么
  5. SpringBoot+SpringCloud面试题整理
  6. PHP+Apache+MySQL+phpMyAdmin安装和配置
  7. EF Join连接查询的坑
  8. Asp.net MVC验证那些事(1)-- 介绍和验证规则使用----[转]--[并修改了部分内容]
  9. poj3635 优先队列+打标记+广搜
  10. 【Spring】Spring AOP详解(转载)