zoukankan      html  css  js  c++  java
  • UVA 12506 Shortest Names (E)

    Shortest Names 

    In a strange village, people have very long names. For example: aaaaa, bbb and abababab.

    You see, it's very inconvenient to call a person, so people invented a good way: just call a prefix of the names. For example, if you want to call `aaaaa', you can call `aaa', because no other names start with `aaa'. However, you can't call `a', because two people's names start with `a'. The people in the village are smart enough to always call the shortest possible prefix. It is guaranteed that no name is a prefix of another name (as a result, no two names can be equal).

    If someone in the village wants to call every person (including himself/herself) in the village exactly once, how many characters will he/she use?

    Input 

    The first line contains T (T$ le$10), the number of test cases. Each test case begins with a line of one integer n ( 1$ le$n$ le$1000), the number of people in the village. Each of the following n lines contains a string consisting of lowercase letters, representing the name of a person. The sum of lengths of all the names in a test case does not exceed 1,000,000.

    Output 

    For each test case, print the total number of characters needed.

    Sample Input 

    1
    3
    aaaaa
    bbb
    abababab
    

    Sample Output 

    5

    思路:先排个序,那么前缀要不一样,要最短,肯定是跟前一个比较或者后一个,取大的那个即可。
     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <string>
     5 #include <iomanip>
     6 #include <algorithm>
     7 #include <queue>
     8 #include <vector>
     9 #include <map>
    10 using namespace std;
    11 #define maxn 1010
    12 string s[maxn];
    13 int T, n, len1, len2, cnt;
    14 int last[maxn], next[maxn];
    15 int main(){
    16     scanf("%d", &T);
    17     while(T--){
    18         scanf("%d", &n);
    19         for(int i = 1; i <= n; i++) cin>>s[i];
    20         sort(s+1,s+1+n);
    21         cnt = 0;
    22         for(int i = 1; i <= n; i++){
    23             if(i == 1) last[i] = 0; //上一个 
    24             else last[i] = next[i-1];
    25             
    26             if(i == n) next[i] = 0;
    27             else{
    28                 len1 = s[i].size(); len2 = s[i+1].size();
    29                 int j;
    30                 for( j = 0; j < len1 && j < len2; j++){
    31                     if(s[i][j] != s[i+1][j]){
    32                         break;
    33                     }
    34                 }
    35                 next[i] = j+1; //next表示i和i+1,last表示i和i-1即 next[i-1]; 
    36             }
    37             cnt += next[i]>last[i]?next[i]:last[i]; 
    38             
    39         }
    40         printf("%d
    ", cnt);
    41     }
    42     
    43     return 0;
    44 }
  • 相关阅读:
    C# 使用FileSystemWatcher类来对一个日志文件的变化进行实时监测
    C# 高效提取txt文档最后一行数据
    C# 高效提取txt文档最后一行数据
    Bat 批处理之 for/f 详解
    Bat 批处理之 for/f 详解
    windows bat命令 如何获取文件最后一行
    windows bat命令 如何获取文件最后一行
    C#读取文件或者字符流的最后几行,类似linux的tail命令OK
    C#读取文件或者字符流的最后几行,类似linux的tail命令OK
    C#开源文件实时监控工具Tail&TailUI
  • 原文地址:https://www.cnblogs.com/titicia/p/3917245.html
Copyright © 2011-2022 走看看