“strcmp()” Anyone?

strcmp() is a library function in C/C++ which compares two strings. It takes two strings as input parameter and decides which one is lexicographically larger or smaller: If the first string is greater then it returns a positive value, if the second string is greater it returns a negative value and if two strings are equal it returns a zero. The code that is used to compare two strings in C/C++ library is shown below:

int strcmp(char *s, char *t)
{
   
int i;
   
for (i=0; s[i]==t[i]; i++)
       
if (s[i]=='\0')
           
return 0;
   
return s[i] - t[i];
}

Figure: The standard strcmp() code
provided for this problem.

The number of comparisons required to
compare two strings in strcmp() function is never returned by the
function. But for this problem you will have to do just that at a
larger scale. strcmp() function continues to compare characters in
the same position of the two strings until two different characters
are found or both strings come to an end. Of course it assumes that
last character of a string is a null (‘\0’) character. For example
the table below shows what happens when “than” and “that”; “therE”
and “the” are compared using strcmp() function. To understand how 7
comparisons are needed in both cases please consult the code block
given above.

t

h

a

N

\0

 

t

h

e

r

E

\0

 

=

=

=

 

=

=

=

 

 

t

h

a

T

\0

t

h

e

\0

 

 

Returns negative
value

7 Comparisons

Returns positive
value

7 Comparisons

Input

The input file contains maximum 10
sets of inputs. The description of each set is given below:

Each set starts with an integer N
(0

Input is terminated by a line containing a single zero. Input file
size is around 23 MB.

Output

For each set of
input produce one line of output. This line contains the serial of
output followed by an integer T. This T denotes the total number of
comparisons that are required in the strcmp() function if all the
strings are compared with one another exactly once. So for N
strings the function strcmp() will be called exactly uva11732 - “strcmp()” Anyone?" title="ACM: uva11732 - “strcmp()” Anyone?" height="43" width="67"> times. You have to
calculate total number of comparisons inside the strcmp() function
in those uva11732 - “strcmp()” Anyone?" title="ACM: uva11732 - “strcmp()” Anyone?" height="43" width="67"> calls. You can assume
that the value of T will fit safely in a 64-bit signed integer.
Please note that the most straightforward solution (Worst Case
Complexity O(N2 *1000)) will time out for this
problem.

Sample Input

2
a
b
4
cat
hat
mat
sir
0

Output for Sample Input

Case 1: 1
Case 2: 6

分析:两个字符串比较次数其实是相同字符数*2+(存在不同字符?1:0);

   然后建字典树,dfs一下即可;

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <unordered_map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define Lson L, mid, ls[rt]
#define Rson mid+1, R, rs[rt]
#define sys system("pause")
#define freopen freopen("in.txt","r",stdin)
const int maxn=4e6+;
using namespace std;
ll gcd(ll p,ll q){return q==?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=;while(q){if(q&)f=f*p;p=p*p;q>>=;}return f;}
inline ll read()
{
ll x=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,k,t,cas,h[maxn],tot;
char str[];
ll ans,num[maxn];
struct node
{
int to,nxt,a;
}e[maxn];
void add(int x,int p)
{
tot++;
e[tot].to=tot;
e[tot].nxt=h[x];
e[tot].a=p;
h[x]=tot;
}
void insert(char *p)
{
int now=,len=strlen(p);
num[now]++;
for(int i=;i<=len;i++)
{
int x=(p[i]>=''&&p[i]<='')?p[i]-'':(p[i]>='A'&&p[i]<='Z'?p[i]-'A'+:(p[i]=='\0'?:p[i]-'a'+));
bool flag=false;
int j;
for(j=h[now];j;j=e[j].nxt)
{
int a=e[j].a;
if(a==x)
{
flag=true;
break;
}
}
if(flag)now=e[j].to;
else add(now,x),now=tot;
num[now]++;
}
}
void dfs(int p)
{
ll tmp=;
for(int i=h[p];i;i=e[i].nxt)
{
int to=e[i].to;
ans+=num[to]*(num[to]-);
if(!tmp)tmp=num[to];
else ans+=tmp*num[to],tmp+=num[to];
dfs(to);
}
}
int main()
{
int i,j;
//freopen;
while(~scanf("%d",&n)&&n)
{
ans=;
tot=;
memset(h,,sizeof(h));
memset(num,,sizeof(num));
rep(i,,n)
{
scanf("%s",str);
insert(str);
}
dfs();
printf("Case %d: %lld\n",++cas,ans);
}
//system("Pause");
return ;
}

“strcmp()” Anyone?的更多相关文章

  1. Uva 11732 strcmp() Anyone?

    strcmp() Anyone? Time Limit: 2000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Subm ...

  2. Linux C 字符串函数 strlen()、strcat()、strncat()、strcmp()、strncmp()、strcpy()、strncpy() 详解

      strlen(返回字符串长度) 表头文件 #include <string.h> 定义函数 size_t strlen(const char *s); 函数说明 strlen()用来计 ...

  3. strcmp

     C++ Code  123456789101112   int strcmp(const char *dest, const char *source) {     assert((NULL !=  ...

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

    指针小知识点: int a =10; int *p=&a; int *q=p;        //p中保存的是a的地址 int *q=p;       //将p的值赋给q 作用是让q也指向a ...

  5. Strcmp(字符串1,字符串2)函数 Sizeof && strlen() Substr(a,b)

    Strcmp(字符串1,字符串2)函数 { strcmp函数是比较两个字符串的大小,返回比较的结果.一般形式是:  i=strcmp(字符串,字符串); 其中,字符串1.字符串2均可为字符串常量或变量 ...

  6. strcmp()&&mb_ereg_replace()&&ereg()

    主要记录两个函数,一个是strcmp(),一个是mb_ereg_replace() strcmp() php 5.3 以后字符串和数组比较会返回0 测试代码: PHP <?php $passwo ...

  7. strcmp函数使用总结

    Action() { /********************************* * Author:旺仔 * object:strcmp * date:2015-12-09 * fuc:我输 ...

  8. strcmp函数的使用

    Action() { /*********************************   * Author:旺仔   * object:strcmp   * date:2015-12-09    ...

  9. c/c++面试题(3)strcat/strcmp/strlen/strcpy的实现

    1.编写一个函数实现strlen以及strcpy函数. strcpy函数. 后面的字符串拷贝到一个字符数组中,要求拷贝好的字符串在字符数组的首 地址,并且只拷贝到'\0'的位置.原型是 char* m ...

  10. strcmp传入nil导致崩溃

    现象:连接电脑可以正常启动程序,不连接电脑启动程序就崩溃. 崩溃信息: BSXPCMessage received error for message: Connection invalid HW k ...

随机推荐

  1. Node.js:全局对象

    概要:本篇博客主要介绍了node.js中的全局对象. 在JavaScript中,通常window是全局对象,而node.js中的全局对象是global,所有全局变量(除了global本身之外)都是gl ...

  2. hdu_5193_Go to movies Ⅱ(带插入删除的逆序对,块状链表)

    题目链接:hdu_5193_Go to movies Ⅱ 题意: 有n个人站成一排,每个人的身高为Hi.每次有人加入或者有人离开,就要判断有多少人站反了(i < j&&Hi> ...

  3. 判断一个数是否为2的n次幂

    参考:http://bbs.csdn.net/topics/370058619 如题,如何判断一个整数是否是2的N次方,我能想到的方法有两个 1.一直除2,看最后是否等于1.(最笨的方法) 2.转换成 ...

  4. Java常用集合类(1)

    一.HashMap 参考文章: http://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E ...

  5. 判断括号字符串是否为合法+求n对括号的所有组合

    n对括号的有效组合数 参考:https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%A1%94%E5%85%B0%E6%95%B0 import java.util.Ar ...

  6. swift 手势之UIPanGestureRecognizer

  7. [转载]Winform中Control的Invoke与BeginInvoke方法

    转自http://www.cppblog.com/baby-fly/archive/2010/04/01/111245.html 一.为什么 Control类提供了 Invoke和 BeginInvo ...

  8. ios随机数

    ios 随机数生成 字数612 阅读3037 评论1 喜欢15 最近一直使用随机数,为了以后方便查阅,总结一下: 在C中提供了rand().srand().random().arc4random()几 ...

  9. 《TCP/IP详解》读书笔记

    本书以UNIX为背景,紧贴实际介绍了数据链层.网络层.运输层   一.整体概念   1.各层协议的关系,只讨论四层 各层常见的协议:   网络层协议:IP协议.ICMP协议.ARP协议.RARP协议. ...

  10. OpenCV——运用于pixels war游戏

    // The "Square Detector" program. // It loads several images sequentially and tries to fin ...