UVA-10887
本题题意就是给你AB两个字符串集,问你以A中字符串作为前缀,B中字符串作为后缀,可以得到多少个不同的字符串,就对每个拼接后的字符串放进字典树,统计单词个数就可以了
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn = 2e6+5;
int root,cnt;
int ans;
int tree[maxn][26];
int end_[maxn];
int newnode()
{
end_[cnt]=0;
for(int i=0;i<26;i++)
tree[cnt][i]=-1;
return cnt++;
}
void init()
{
ans=0;
cnt=0;
root=newnode();
}
void insert_(string str)
{
int tmp=root;
int len=str.size();
for(int i=0;i<len;i++)
{
int id=str[i]-'a';
if(tree[tmp][id]==-1)
{
tree[tmp][id]=newnode();
}
tmp=tree[tmp][id];
}
if(end_[tmp]==0)
{
end_[tmp]=1;
ans++;
}
return ;
}
string str1[1505];
string str2[1505];
string str3;
char tmp1[15];
char tmp2[15];
int main()
{
int n,m,t;
int cnt=1;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d",&n,&m);
getchar();
for(int i=0;i<n;i++)
{
gets(tmp1);//读入可能有空行,用gets
str1[i]=tmp1;
}
for(int i=0;i<m;i++)
{
gets(tmp2);
str2[i]=tmp2;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
str3=str1[i]+str2[j];//拼接
insert_(str3);
}
}
printf("Case %d: %d\n",cnt++,ans);
}
return 0;
}