原题链接:
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;
}