UVa 11732-strcmp() Anyone?
程序员文章站
2022-04-17 14:45:11
...
由于数据规模的原因,需要用多叉树来构建Trie,即一个结点的子树通过一个子节点串起来,这样节省很多空间。本代码的Node.count为插入时搜索路径经过该结点的次数,表明多少个字符串在Trie相应的深度位置和当前字符串里的相应位置的字符相等,如果相等就要加上其次数乘上2,如果不相等直接加上其次数。
#include <cstdio>
#include <memory.h>
#include <cstring>
#define maxnode 4000005
#define LL long long
using namespace std;
struct Node{
char ch;
Node* brother;
Node* child;
int count;
};
Node map[maxnode];
class Trie{
public:
Node* root;
LL ans;
int sz;
void Initial(){
sz=1;
ans=0;
root=NewNode(0);
}
Node* NewNode(char c){
map[sz].ch=c;
map[sz].brother=map[sz].child=NULL;
map[sz].count=0;
return &map[sz++];
}
void Trie_Insert(char str[],int n){
Node* node=root->child,*last=root;
bool flag;
for(int i=0;i<=n;++i){
flag=0;
for(Node* next=node;next!=NULL;next=next->brother){
if(next->ch==str[i]){
flag=1;
node=next;
ans+=next->count*2;
}else ans+=next->count;
}
if(!flag){
Node* temp=NewNode(str[i]);
temp->brother=last->child;
last->child=temp;
node=temp;
}
node->count++;
last=node;
node=node->child;
}
}
};
int main(){
int n,len=1;
char str[1010];
Trie trie;
while(~scanf("%d",&n)){
if(n==0) break;
getchar();
trie.Initial();
while(n--){
gets(str);
trie.Trie_Insert(str,strlen(str));
}
printf("Case %d: %lld\n",len++,trie.ans);
}
return 0;
}
上一篇: 很油菜的拍马屁和顺口溜。
下一篇: 爆笑尬事儿,怎么就淡定不了呢!
推荐阅读
-
团体队列 UVA540 Team Queue
-
丑数(Ugly Numbers, UVa 136)
-
破损的键盘(悲剧文本)(Broken Keyboard(a.k.a. Beiju Text),Uva 11988)
-
集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096)
-
唯一的雪花(Unique snowflakes,UVa 11572)滑动窗口+set
-
[UVA - 11584] Partitioning by Palindromes dp预处理
-
UVA227-Puzzle
-
UVA 442 Matrix Chain Multiplication ( stack 应用)
-
UVA 136 - Ugly Numbers(优先队列 + 集合)
-
(UVa 136) Ugly Numbers(丑数的生成+整数分解定理+优先队列)