“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. jQuery复习:第二章&第三章

    第二章 一.选择器 1.层次选择器 $(“ancestor descendant”)选取ancestor元素里的所有后代元素 $(“parent > child”)选取parent元素下的chi ...

  2. oracle 写入txt

    分几个步骤 1,创建输出路径,比如你要在/orcl/dir目录下输出,你就先要建立好这个路径,并在root用户下 chmod 777 /orcl/dir 2,sqlplus下以sysdba登录,执行以 ...

  3. POJ 2311 Cutting Game(SG+记忆化)

    题目链接 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ][ ...

  4. 38.利用接口做参数,写个计算器,能完成+-*/运算 (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) 此方法要求能够:1.用传递过来的对象调用comp

    //接口Compute package jieKou; public interface Compute { int Computer(int n,int m); } //加 package jieK ...

  5. NOTE07152246 JAVA 发展及JDK配置

    一.软件工程师体系: 操作系统(Windows/Linux/Unix) - 数据库系统 - 中间件(WebSphere/Tomcat) - JAVA EE 1.操作系统为用户构建了一个平台.此平台上可 ...

  6. KVM 虚拟化基本搭建

    KVM虚拟化技术 KVM是基于x86架构上Linux操作系统的全虚拟化解决方案 ,在Centos6.3系统中,kvm已经被集成到内核中,相当于使用内核来做虚拟机管理程序.由于KVM本身就工作于内核环境 ...

  7. POJ1113 Wall 凸包

    题目大意:建立围墙将城堡围起来,要求围墙至少距离城堡L,拐角处用圆弧取代,求围墙的长度. 题目思路:围墙长度=凸包周长+(2*PI*L),另外不知道为什么C++poj会RE,G++就没问题. #inc ...

  8. Windows 小端存储

    小端->高高低低(高位存在高地址,低位存在低地址)

  9. 9---PIP 管理工具的使用

    Python 不仅有强大的内置模块,还提供强大的三方模块. 官方网站: https://pypi.python.org/pypi 要适用三方的模块需要使用pip管理工具. 1.在安装pip前,请确认w ...

  10. SharedPreferences的工具类

    import android.content.Context; import android.content.SharedPreferences; import android.content.Sha ...