strcmp() Anyone?

uva11732:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=2832&mosmsg=Submission+received+with+ID+13889354

题意:给你n个串,串之间两两进行比较,计算字符被比较的总次数。

题解:这里注意,‘\0‘也会被比较。这一题,看的是刘汝佳的代码,才知道怎么统计比较的次数。下面的代码,是刘汝佳的代码。

 1 #include<cstring>
 2 #include<vector>
 3 using namespace std;
 4 const int maxnode = 4000 * 1000 + 10;
 5 const int sigma_size = 26;
 6 // 字母表为全体小写字母的Trie
 7 struct Trie {
 8   int head[maxnode]; // head[i]为第i个结点的左儿子编号
 9   int next[maxnode]; // next[i]为第i个结点的右兄弟编号
10   char ch[maxnode];  // ch[i]为第i个结点上的字符
11   int tot[maxnode];  // tot[i]为第i个结点为根的子树包含的叶结点总数
12   int sz; // 结点总数
13   long long ans; // 答案
14   void clear() {
15     sz = 1;
16     tot[0] = head[0] = next[0] = 0;
17      } // 初始时只有一个根结点
18
19   // 插入字符串s(包括最后的‘\0‘),沿途更新tot
20   void insert(const char *s) {
21     int u = 0, v, n = strlen(s);
22     tot[0]++;
23     for(int i = 0; i <= n; i++) {
24       // 找字符a[i]
25       bool found = false;
26       for(v = head[u]; v != 0; v = next[v])
27         if(ch[v] == s[i]) { // 找到了
28           found = true;
29           break;
30         }
31       if(!found) {
32         v = sz++; // 新建结点
33         tot[v] = 0;
34         ch[v] = s[i];
35         next[v] = head[u];
36         head[u] = v; // 插入到链表的首部
37         head[v] = 0;
38       }
39       u = v;
40       tot[u]++;
41     }
42   }
43
44   // 统计LCP=u的所有单词两两的比较次数之和
45   void dfs(int depth, int u) {
46     if(head[u] == 0) // 叶结点
47       ans += tot[u] * (tot[u] - 1) * depth;
48     else {
49       int sum = 0;
50       for(int v = head[u]; v != 0; v = next[v])
51         sum += tot[v] * (tot[u] - tot[v]); // 子树v中选一个串,其他子树中再选一个
52       ans += sum / 2 * (2 * depth + 1); // 除以2是每种选法统计了两次
53       for(int v = head[u]; v != 0; v = next[v])
54         dfs(depth+1, v);
55     }
56   }
57
58   // 统计
59 long long count() {
60     ans = 0;
61     dfs(0, 0);
62     return ans;
63   }
64 };
65 #include<cstdio>
66 const int maxl = 1000 + 10;   // 每个单词最大长度
67 int n;
68 char word[maxl];
69 Trie trie;
70 int main() {
71   int kase = 1;
72   while(scanf("%d", &n) == 1 && n) {
73     trie.clear();
74     for(int i = 0; i < n; i++) {
75       scanf("%s", word);
76       trie.insert(word);
77     }
78     printf("Case %d: %lld\n", kase++, trie.count());
79   }
80   return 0;
81 }

strcmp() Anyone?

时间: 2024-10-05 04:24:20

strcmp() Anyone?的相关文章

C语言::模拟实现strcmp函数

题目要求 编写一个C语言程序模拟实现strcmp函数. (我们依然先模拟实现strcmp函数,然后再对照string.h库中strcmp函数的实现,对比与大师之间的差距.) 算法分析 通过上一篇文章:C语言::strcmp函数功能.原型.用法及实例我们获得了strcmp函数的如下信息: strcmp原型:int strcmp( const char *s1, const char *s2 ); strcmp功能:将两个字符串自左向右逐个字符进行相比(根据ASCII值大小),直到出现不同的字符或遇

算法笔记_084:蓝桥杯练习 11-1实现strcmp函数(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 自己实现一个比较字符串大小的函数,也即实现strcmp函数.函数:int myStrcmp(char *s1,char *s2) 按照ASCII顺序比较字符串s1与s2.若s1与s2相等返回0,s1>s2返回1,s1<s2返回-1.具体来说,两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止(注意'\0'值为0,小于任意ASCII字符).如: "A"<"

strlen(); strcpy(); strcat(); strcmp() ---笔记

指针小知识点: int a =10; int *p=&a; int *q=p;        //p中保存的是a的地址 int *q=p;       //将p的值赋给q 作用是让q也指向a strlen( ); 求字符串的长度 strcpy( ); 复制字符串 strcat( ); 连接字符串 strcmp( ); 字符串大小的比较 1 typedef unsigned int size_t 2 3 size_t my_strlen (const char *str) // strlen()

实现strlen()函数,strcmp()函数 const知识点

1.strlen()函数的实现: #include<stdio.h> int strLen(char *str); int strLen(char *str){     int i = 0;          while(*str){         str++;         i++;     }          return i; } void main(void){     char *str = "abcdefg";     int length;       

GNU LIBC源码学习之strcmp

比较两个字符串 我的代码块 #include <string.h> int my_strcmp(const char* s1,const char * s2) { if((s1==NULL)||(s2==NULL)) return 0; while(1) { if((*s1=='\0')||(*s2=='\0')) break; if(*s1>*s2) return 1; if(*s1<*s2) return -1; s1++; s2++; } //if(*s1==*s2=='\0

PHP strcmp,strnatcmp,strncmp函数的区别

字符串比较说明当s1<s2时,返回为负数当s1=s2时,返回值= 0当s1>s2时,返回正数 1 <?php 2 $str1 = 'str100'; 3 $str2 = 'str20'; 4 echo strcmp($str1, $str2)."<br>"; 5 //输出-1 6 echo strnatcmp($str1, $str2)."<br>"; 7 //输出1 8 echo strncmp($str1, $str2,

教教大家一些strcpy,strcmp,strcat,strlen函数的写法

VC源码: strcmp函数的写法: #include<stdio.h> #include<string.h> int strcmp1(char* a, char* b) { for(;*a==*b;a++,b++) if(*a!='\0') return 0; return *a - *b; } main() {  int l; char a[10]={"db"}; char b[10]={"cb"}; l=strcmp1(a,b); pr

strcpy,strncpy,strcmp函数

void mystrcpy(char *dst,const char * src)//当dst的内存长度不够时将会产生溢出 { if (dst==NULL||src==NULL) { exit(0); } while(*src!='\0') *dst++=*src++; *dst='\0'; } int main() { char src[]="hello world"; char dst[]="zzzzzz"; strcpy(dst,src);//错误 发生越界

uva 11732 - strcmp() Anyone?(字典树)

题目链接:uva 11732 - strcmp() Anyone? 题目大意:给定n个串,然后两两之间比较,问说总共要比较多少次. 解题思路:字典树,建立出字典树,然后根据字典树的性质在节点记录有多少个字符串包含该节点.因为节点的个数比较多,所以用左孩子右兄弟的方法建立字典树. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long

实现strcmp很简单的思维

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void strcom(char *str1 , char *str2,int *num) { int a = 0; int count = 0; //关键在这里 用指针进行循环判断 while (*str1&&*str2) { str1++; str2++; if ((a=*str1 - *str2) != 0) { *num