您的位置:首页 > 其它

UVA 10887 Concatenation of Languages

2014-08-20 19:22 288 查看
题目大意:

     问两种类型的单词一共能够组成多少种不同的单词。

解决方法:

     字符串hash

我的代码:

#include <cstdio>
#include <string>
#include <iostream>
#include <cstring>
#include <algorithm>
#define seed 131
#define ull signed long long
#define maxn 1600
using namespace std;
char sn[maxn][maxn],sm[maxn][maxn];
ull sn1[maxn],sm1[maxn];
int sn2[maxn],sm2[maxn];
ull base[maxn*3],ub[maxn*maxn];
int n,m;
int solve(){
int ans=0,totl=0;
for (int i=0;i<n;i++)
for (int j=0;j<m;j++){
ub[totl++]=sn1[i]*base[sm2[j]]+sm1[j];
//cout<<i<<" "<<j<<endl;
//cout<<sn1[i]<<" "<<sm1[i]<<endl;
//cout<<ub[totl-1]<<endl;
}
sort(ub,ub+totl);
for (int i=0;i<totl;i++){
if (!i) ans++;
else if (ub[i]!=ub[i-1]) ans++;
else ;
}
return ans;
}
int main (){
//freopen("test.in","r",stdin);
base[0]=1;
for (int i=1;i<maxn*3;i++)
base[i]=base[i-1]*seed;
int T,t=1;scanf("%d",&T);
while (T--){
printf("Case %d: ",t++);
scanf("%d%d",&n,&m);gets(sn[0]);
for (int i=0;i<n;i++) {
gets(sn[i]);
sn2[i]=strlen(sn[i]);sn1[i]=0;
for (int j=0;j<sn2[i];j++)
sn1[i]=sn1[i]*seed+sn[i][j];
}
for (int i=0;i<m;i++) {
gets(sm[i]);
sm2[i]=strlen(sm[i]);sm1[i]=0;
for (int j=0;j<sm2[i];j++)
sm1[i]=sm1[i]*seed +sm[i][j];
}
printf("%d\n",solve());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: