“strcmp()” Anyone?
“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) |
|
Figure: The standard strcmp() code |
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 7 Comparisons |
Returns positive 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?的更多相关文章
- Uva 11732 strcmp() Anyone?
strcmp() Anyone? Time Limit: 2000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu [Subm ...
- Linux C 字符串函数 strlen()、strcat()、strncat()、strcmp()、strncmp()、strcpy()、strncpy() 详解
strlen(返回字符串长度) 表头文件 #include <string.h> 定义函数 size_t strlen(const char *s); 函数说明 strlen()用来计 ...
- strcmp
C++ Code 123456789101112 int strcmp(const char *dest, const char *source) { assert((NULL != ...
- strlen(); strcpy(); strcat(); strcmp() ---笔记
指针小知识点: int a =10; int *p=&a; int *q=p; //p中保存的是a的地址 int *q=p; //将p的值赋给q 作用是让q也指向a ...
- Strcmp(字符串1,字符串2)函数 Sizeof && strlen() Substr(a,b)
Strcmp(字符串1,字符串2)函数 { strcmp函数是比较两个字符串的大小,返回比较的结果.一般形式是: i=strcmp(字符串,字符串); 其中,字符串1.字符串2均可为字符串常量或变量 ...
- strcmp()&&mb_ereg_replace()&&ereg()
主要记录两个函数,一个是strcmp(),一个是mb_ereg_replace() strcmp() php 5.3 以后字符串和数组比较会返回0 测试代码: PHP <?php $passwo ...
- strcmp函数使用总结
Action() { /********************************* * Author:旺仔 * object:strcmp * date:2015-12-09 * fuc:我输 ...
- strcmp函数的使用
Action() { /********************************* * Author:旺仔 * object:strcmp * date:2015-12-09 ...
- c/c++面试题(3)strcat/strcmp/strlen/strcpy的实现
1.编写一个函数实现strlen以及strcpy函数. strcpy函数. 后面的字符串拷贝到一个字符数组中,要求拷贝好的字符串在字符数组的首 地址,并且只拷贝到'\0'的位置.原型是 char* m ...
- strcmp传入nil导致崩溃
现象:连接电脑可以正常启动程序,不连接电脑启动程序就崩溃. 崩溃信息: BSXPCMessage received error for message: Connection invalid HW k ...
随机推荐
- Sass与Compress实战:第六章
概要:介绍Compass如何让你从本地开发原型轻松转移到正产环境的网址或Web应用中. 本章内容: ● CSS精灵的历史和基本原则 ● Compass混合器让精灵自动化 ● 自定义精灵图片和CSS输出 ...
- C#数组和元组
声明数组 int[] myArray; 初始化数组 myArray = new int[4]; 数组是引用类型当初始化完毕后,将在托管堆上分配内存空间,其结构图如下
- c#.net 获取时间日期年月日时分秒格式
今天写代码发现两个比较不错的分享下:1.DateTime.ParseExact很多时候我们获取的时间是数字形式表示的,好比20140127134015.927856,通过这个方法DateTime.Pa ...
- JuneX_13
在积分制的压力下,基本上能打的比赛都打了(除了忘了的).打了这么多比赛(其实也不多),发现有相当一部分题目考察的还是挺基础的内容,像搜索,DP,树,图,然而做的并不好.要么直接不会敲,要么调试大半天, ...
- dplyr 数据操作 列操作(select / mutate)
在R中,我们通常需要对数据列进行各种各样的操作,比如选取某一列.重命名某一列等. dplyr中的select函数子在数据列的操作上也同样表现了它的简洁性,而且各种操作眼花缭乱. select(.dat ...
- CMake VS工程总结
1.设置输出后缀 set(CMAKE_DEBUG_POSTFIX "d") 2.设置输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_ ...
- LeetCode OJ 48. Rotate Image
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- MyBatisNet 学习
SQL Maps Sql Maps是这个框架中最激动人心的部分,它是整个iBATIS Database Layer的核心价值所在.通过使用Sql Maps你可以显著的节约数据库操作的代码量.SQL M ...
- SharePoint 2013 配置InfoPath 列表表单
转载来源:http://www.cnblogs.com/jianyus/p/3470113.html SharePoint列表,都是通过表单展示,有时候不太符合要求,这时候,我们可以通过定制表单,来是 ...
- ural 1698. Square Country 5(记忆化搜索)
1698. Square Country 5 Time limit: 2.0 secondMemory limit: 64 MB The first arithmetical operation ta ...