hust 1004 - String Compare 字符串排序

原题链接:

http://acm.hust.edu.cn/problem/show/1004

1004 - String Compare

Time Limit: 2s Memory Limit: 64MB

Submissions: 893 Solved: 152
DESCRIPTION
Maybe there are 750,000 words in English and some words are prefix of other words, for example: the word "acm" can be treat as one prefix of "acmicpc". What's more, most of such pairs of words have relationship between them. Now give you a dictionary, your work is to tell me how many such pairs.  There may be other characters in the word, for example '_','-',and so on. Pay attention that 'A' and 'a' are not the same character!
INPUT
In the first line of the input file there is an Integer T, which means the number of test cases. Followed by T test cases. For each test case, in the first line there is an integer N(0<N<50000), followed N lines, each contains a word whose length is less than 30 and no space appears in any word. There are no same words in two different lines.
OUTPUT
For each test case, tell me how many such pairs. If the number is  larger than 11519, just divide it by 11519 and only output the remainder.
SAMPLE INPUT
2
2
acmicpc
acm
3
a
abc
ab
SAMPLE OUTPUT
1
3
HINT
SOURCE
Sempr|CrazyBird|hust07p43

题意:保证输入n个不相同的字符串,问存在多少对字符串(a,b),使a为b的前缀。

解法:

①对字符串按照字典序排列,就保证了字符串前端相同的排在一起并且长度从小到大;

②枚举字符串从1~n,对第i个字符串,向后寻找是否存在以它为前缀的字符串,这里注意弹出条件,若j不是以i为前缀,说明j后面的字符串也都不符合,就可以弹出了,原理在于之前的字典序排序。


代码:

#include "stdio.h"
#include "string.h"
#include "iostream"
#include "algorithm"
using namespace std;
 
struct aa
{
	char a[32];
}s[50010];
 
int cmp(struct aa a1,struct aa a2)
{
	return strcmp(a1.a,a2.a)<0;
}
 
int main()
{
	int T,n,len,ans,w,i,j;
	scanf("%d",&T);
	while(T--)
	{
		ans=0;
		scanf("%d",&n);
		for(i=0;i<n;i++)
			scanf("%s",&s[i].a);
		sort(s,s+n,cmp);
		for(i=0;i<n-1;i++)
		{
			len=strlen(s[i].a);
			for(j=i+1;j<n;j++)
			{	
				for(w=0;w<len;w++)
				{
					if(s[i].a[w]!=s[j].a[w])
					{
						break;
					}
				}
				if(w<len)
					break;
				else
					ans++;
			}
		}
		if(ans>11519)
			ans=ans%11519;
		printf("%d\n",ans);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值