“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. 13.hibernate的native sql查询(转自xiaoluo501395377)

    hibernate的native sql查询   在我们的hibernate中,除了我们常用的HQL查询以外,还非常好的支持了原生的SQL查询,那么我们既然使用了hibernate,为什么不都采用hi ...

  2. Unity开发Oculus游戏

    1.下载Oculus对应自己操作系统的SKD&RunTime 下载地址 我这里是window系统,下载的是0.6.0.0版本的 2.安装RunTime,电脑右下角状态栏会出现一个小眼睛表示安装 ...

  3. bug记录_signalr执行$.connnection.testhub结果为空

    最后发现配置文件<appSettings>中多了一句<add key="owin:AutomaticAppStartup" value="false&q ...

  4. 模拟器SDK路径

    I'm guessing you already find it out, but just for the record: the UIKit.framework is available only ...

  5. shell脚本学习(五)

    1.统计文件的行数.单词数.字符数 1)行数: wc -l file cat file | wc -l 2)单词数 wc -w file cat file | wc -w 3)统计字符数 wc -c ...

  6. Hanoi汉诺塔问题——递归与函数自调用算法

    题目描述 Description 有N个圆盘,依半径大小(半径都不同),自下而上套在A柱上,每次只允许移动最上面一个盘子到另外的柱子上去(除A柱外,还有B柱和C柱,开始时这两个柱子上无盘子),但绝不允 ...

  7. Openjudge-计算概论(A)-放苹果

    描述: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法.输入第一行是测试数据的数目t(0 <= t < ...

  8. Openjudge-计算概论(A)-字符串排序

    描述 参考整数排序方法,设计一种为字符串排序的算法,将字符串从小到大输出 输入 第一行为测试数据组数t, 后面跟着t组数据.每组数据第一行是n,表示这组数据有n行字符串,接下来是要排序的n行字符串.每 ...

  9. Ubuntu iptalbes 保存配置

     ubuntu 保存防火墙命令,iptables方式:1.iptables 配置好策略2.iptables-save > /etc/network/iptables.up.rules ,配置的策 ...

  10. 深入体会__cdecl与__stdcall

    在学习C++的过程中时常碰到WINAPI或者CALLBACK这样的调用约定,每每觉得十分迷惑.究竟这些东西有什么用?不用他们又会不会有问题?经过在网上的一番搜寻以及自己动手后,整理成以下的学习笔记.1 ...