HDU-3460 Ancient Printer 字典树

本文介绍了一种用于优化打字机打印多个字符串的算法,通过先打印最长字符串并进行预处理,有效减少了打印总时间。

  该题题意是求给定的字符串集用一个打字机来打出所有的字符串(最后一个),顺序可以打乱,每次操作可以向打字机的末尾添加一个字符删除一个字符以及打印一个单词。这里有一个很强大的想法,那就是先假设每个单词都打印出来起消耗为 sumlenth * 2 + N,在统计所有的相同的字符数 M, 然后得到最长的一个单词的长度L,把这个单词的放在最后打印,最后答案就是 sumlen * 2 + N - M.

  代码如下:

 1 #include <cstdlib>
2 #include <cstdio>
3 #include <cstring>
4 using namespace std;
5
6 struct Node
7 {
8 int cnt;
9 Node *child[26];
10 };
11
12 inline Node *init( )
13 {
14 Node *p = new Node;
15 p->cnt = -1;
16 memset( p->child, 0, sizeof( p->child ) );
17 return p;
18 }
19
20 inline bool getint( int &t )
21 {
22 char c;
23 int f = 1;
24 while( c = getchar(), ( c < '0' || c > '9' ) && c != '-' )
25 if( c == EOF ) return false;
26 if( c == '-' ) f = -1;
27 else t = c - '0';
28 while( c = getchar(), c >= '0' && c <= '9' )
29 t = t * 10 + c - '0';
30 return true;
31 }
32
33 inline void getstr( char *s )
34 {
35 char c;
36 int p = 0;
37 while( c = getchar(), c == ' ' || c == '\n' ) ;
38 s[p++] = c;
39 while( c = getchar(), c != ' ' && c != '\n' )
40 s[p++] = c;
41 s[p] = '\0';
42 }
43
44 inline void insert( Node *p, char *in )
45 {
46 int dx = *in - 'a';
47 if( *in )
48 {
49 if( p->child[dx] == NULL )
50 p->child[dx] = init();
51 p->child[dx]->cnt++;
52 insert( p->child[dx], in + 1 );
53 }
54 }
55
56 inline void getsum( Node *p, int &cnt )
57 {
58 for( int i = 0; i < 26; ++i )
59 {
60 if( p->child[i] )
61 {
62 cnt += p->child[i]->cnt;
63 getsum( p->child[i], cnt );
64 }
65 }
66 free( p );
67 }
68
69 int main()
70 {
71 int N;
72 while( getint( N ) )
73 {
74 Node *r = init();
75 char str[55];
76 int ans = 0, cnt = 0, maxlen = -0x7fffffff;
77 for( int i = 0; i < N; ++i )
78 {
79 getstr( str );
80 int len = strlen( str );
81 maxlen = maxlen > len ? maxlen : len;
82 ans += len;
83 insert( r, str );
84 }
85 getsum( r, cnt );
86 printf( "%d\n", ( ans - cnt ) * 2 + N - maxlen );
87 }
88 }

转载于:https://www.cnblogs.com/Lyush/archive/2011/09/06/2168976.html

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值