因为字符集比较大,所以就不能用简单字典树,在字典树里面,用链表进行存储。这个倒是不难,练了下手

统计的时候还是有点难搞,因为要算所有的两两比较的次数之和,对分叉处进行计算,注意细节

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = *+;
struct Trie
{
int head[N];
int next[N];
char ch[N];
int tot[N];
int sz;
long long ans;
void clear()
{
sz=;
head[]=next[]=tot[]=;
ans=;
}
void insert(const char* s)
{
int u=,v,len;
len=strlen(s);
tot[]++;
for (int i=; i<=len; i++)
{
bool found=false;
for (v=head[u]; v!=; v=next[v])
{
if (ch[v]==s[i])
{
found=true;
break;
}
}
if (!found)
{
v=sz++;
ch[v]=s[i];
tot[v]=;
next[v]=head[u];
head[u]=v;
head[v]=;
}
u=v;
tot[u]++;
}
} void dfs(int depth, int u) //计算总数
{
if(head[u] == )
ans += tot[u] * (tot[u] - ) * depth;
else
{
int sum = ;
for(int v = head[u]; v != ; v = next[v])
sum += tot[v] * (tot[u] - tot[v]);
ans += sum / * ( * depth + );
for(int v = head[u]; v != ; v = next[v])
dfs(depth+, v);
}
} long long count()
{
ans = ;
dfs(, );
return ans;
}
} T;
char str[];
int main()
{
int n; int kase=;
while (scanf("%d",&n) && n)
{
T.clear();
for (int i=; i<=n; i++)
{
scanf("%s",str);
T.insert(str);
}
T.count();
printf("Case %d: %lld\n",++kase,T.ans);
}
return ;
}

UVA 11732 链表+字典树的更多相关文章

  1. UVA 11732 strcmp() Anyone? (压缩版字典树)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  2. UVA - 11488 字典树

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  3. UVA 11488 Hyper Prefix Sets (字典树)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  4. HDU 1251 统计难题(字典树 裸题 链表做法)

    Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己 ...

  5. UVA - 12333 字典树+大数

    思路:用字典树将前40个数字记录下来,模拟大数加法即可. AC代码 #include <cstdio> #include <cmath> #include <algori ...

  6. UVA Phone List (字典树)(查询是否有前缀或自身是其他的前缀)

    Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16341   Accepted: 5228 Descr ...

  7. UVA - 12333 Revenge of Fibonacci 高精度加法 + 字典树

    题目:给定一个长度为40的数字,问其是否在前100000项fibonacci数的前缀 因为是前缀,容易想到字典树,同时因为数字的长度只有40,所以我们只要把fib数的前40位加入字典树即可.这里主要讨 ...

  8. uva 11488 - Hyper Prefix Sets(字典树)

    H Hyper Prefix Sets Prefix goodness of a set string is length of longest common prefix*number of str ...

  9. UVa 12333 - Revenge of Fibonacci manweifc(模拟加法竖式 & 字典树)

    题意: 给定n个(n<=40)数字, 求100000个以内有没有前面n个数字符合给定的数字的fibonacci项, 如果有, 给出最小的fibonacci项, 如果没有, 输出-1. 分析: 可 ...

随机推荐

  1. thinkphp5+python.apscheduler实现计划任务

    1.thinkphp5配置自定义命令行 /application/console/command namespace app\console\command; use think\console\Co ...

  2. 009-PHP循环输出数组成员

    <?php $Cities[] = "<B>北京</B>"; //等同于$Cities[0] = "北京" $Cities[] = ...

  3. Font Awesome可缩放的矢量图标

    我感觉图标还行~~~这里是我修改过的,自己根据需要修改即可~~ 网址: http://fontawesome.dashgame.com/ 使用: <link rel="styleshe ...

  4. POJ 3090 欧拉函数

    求一个平面内可见的点,其实就是坐标互质即可,很容易看出来或者证明 所以求对应的欧拉函数即可 #include <iostream> #include <cstdio> #inc ...

  5. linux 查看运行进程详细信息

    Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息 通过ll或ls –l命令即可查看. ll /proc/PID cwd符号链接的是进程运行 ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-plus

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. Linux系统sda变sdb的解决

    起因 我的电脑有一个128G的固态以及一个500G的机械,我将系统安装在128G固态中,于是将500G的机械(/dev/sdb)挂在在/home目录下,安装完系统后执行lsblk命令 NAME MAJ ...

  8. P1085 PAT单位排行

    转跳点:

  9. C++ Socket WSAENOBUFS WSAoverlapped

    WSARecv的时候,投递的接收缓冲区的大小设置为0. 然后手动调用非阻塞recv从缓冲区接受数据,直到WSAEWOULDBLOCK,不然会有很多的buffer被锁住,当客户端的数量达到一定数目时,就 ...

  10. C++面试常见问题——09static关键字

    static关键字 局部变量 局部变量 局部变量是最常见的量,编译器不会对其进行初始化,除非对其显式赋值,不然初始值是随机的. 普通局部变量存储在栈空间,使用完毕后会立即被释放. 静态局部变量 静态局 ...