//题意:给出已有文件及相应文件出现的次数,对这些文件进行搜索,若相同,则计算它们出现次数的乘积,在开平方根,直到一次文件的检索结束,输出每次检索后的各个平方根的和
#include<iostream>
#include<string>
#include<stdio.h>
#include<cmath>
using namespace std;
struct Map
{
string str; //搜索项
int num; //搜索项对应的次数
Map()
{
num = 0;
str = "";
}
}map1[255],map2[255]; //分别代表数据项和文件搜索项
int maplen1,maplen2; //搜索项对应的长度
string fileName; //输入已有文件的名字
string s; //带查找文件的名字
string ss;
const string ten_ = "----------"; //定义常量字符串
void compare(int a)
{
int i;
int flag = 0;
if(a == 1) //已有文件的添加
{
for(i = 0;i < maplen1;i++)
{
if(map1[i].str == ss)
{
map1[i].num++;
flag = 1;
break;
}
}
if(!flag)
{
map1[i].str = ss;
map1[i].num++;
maplen1++;
}
}
else //待查找文件的添加
{
for(i = 0;i < maplen2;i++)
{
if(map2[i].str == ss)
{
map2[i].num++;
flag = 1;
break;
}
}
if(!flag)
{
map2[i].str = ss;
map2[i].num++;
maplen2++;
}
}
}
void init() //待查找文件的初始化
{
int i;
for(i = 0;i < 255;i++)
map2[i].num = 0;
}
void solve()
{
int i = 0;
int j = 0;
double num = 0,a;
for(i = 0;i < maplen1;i++)
{
for(j = 0;j < maplen2;j++)
{
if(map1[i].str == map2[j].str)
{
a= map1[i].num*map2[j].num*1.0; //已有文件的文件名和待搜索文件匹配时求各个文件出现的次数的乘积,在求平方根
num += sqrt(a);
break;
}
}
}
printf("%.2f\n",num);
maplen2 = 0;
}
int main()
{
int i;
maplen1 = 0;
while(cin>>fileName)
{
if(fileName == ten_)
break;
ss = "";
int len = fileName.length();
for(i = 0;i < len;i++) //对文件名进行检索,文件名只能是数字和小写字母,若为大写字母就转化为小写字母
{
if(isdigit(fileName[i])|| islower(fileName[i]))
ss += fileName[i];
else if(isupper(fileName[i]))
ss += (fileName[i] - 'A' + 'a');
}
if(ss != "")
{
compare(1);
}
}
/* cout<<"**************************"<<endl;
for(i = 0;i < maplen1;i++)
cout<<map1[i].str <<" "<<map1[i].num <<endl;
cout<<"**************************"<<endl;
*/
while(cin>>s)
{
if(s == ten_)
break;
maplen2 = 0;
init();
while(1)
{
ss = "";
int slen = s.length();
for(i = 0;i < slen;i++)
{
if(isdigit(s[i])|| islower(s[i]))
ss += s[i];
else if(isupper(s[i]))
ss += (s[i] - 'A' + 'a');
}
if(ss != "")
{
compare(2);
}
cin>>s;
if(s == ten_)
break;
}
solve();
}
return 0;
}