现在的位置: 首页 > 综合 > 正文

UVA 10887 Concatenation of Languages

2019年04月08日 ⁄ 综合 ⁄ 共 1699字 ⁄ 字号 评论关闭

大意略。

思路:首先开始写了一个STL,后来果断发现老是WA,为什么呢?后来手写了一个哈希,还是WA,然后发现,靠,原来还有空串,题目木有说呀。

/*哈希 0.752s*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <set>
#include <map>
using namespace std;

const int MAXSIZE = 10000003;
const int MAXN = 1510;

char A[MAXN][15], B[MAXN][15];
char st[MAXN*MAXN][30];
int first[MAXSIZE], next[MAXN*MAXN];

int n, m;

void init()
{
	memset(first, -1, sizeof(first));
}

int ELFhash(char *key)
{
    unsigned long h = 0;
    while (*key)
    {
          h = (h<<4) + *key++;
          unsigned long g = h & 0xf0000000L;
          if (g) h^= g>>24;
          h &= ~g;
    }
    return h % MAXSIZE;
}

int try_to_insert(int s)
{
	int h = ELFhash(st[s]);
	for(int v = first[h]; v != -1; v = next[v])
	{
		if(!strcmp(st[s], st[v])) return 0;
	}
	next[s] = first[h];
	first[h] = s;
	return 1;
}

void read_case()
{
	init();
	scanf("%d%d%*c",  &n, &m);
	for(int i = 0; i < n; i++) gets(A[i]);
	for(int i = 0; i < m; i++) gets(B[i]);
}

void solve()
{
	read_case();
	int ans = 0, rear = 0;
	for(int i = 0; i < n; i++)
	{
		char temp[30] = {'\0'};
		for(int j = 0; j < m; j++)
		{
			strcpy(temp, A[i]);
			strcat(temp, B[j]);
			strcpy(st[rear], temp);
			if(try_to_insert(rear)) { rear++; ans++;}
		}
	}
	printf("%d\n", ans);
}

int main()
{
	int T, times = 0;
	scanf("%d%*c", &T);
	while(T--)
	{
		printf("Case %d: ", ++times);
		solve();
	}
	return 0;
}
/*STL 2.476*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <set>
#include <map>
using namespace std;

const int MAXN = 1510;

map<string, int> Map;

char A[MAXN][15], B[MAXN][15];

int n, m;

void init()
{
	Map.clear();
}

void read_case()
{
	init();
	scanf("%d%d%*c",  &n, &m);
	for(int i = 0; i < n; i++) gets(A[i]);
	for(int i = 0; i < m; i++) gets(B[i]);
}

void solve()
{
	read_case();
	for(int i = 0; i < n; i++)
	{
		char temp[30] = {'\0'};
		for(int j = 0; j < m; j++)
		{
			strcpy(temp, A[i]);
			strcat(temp, B[j]);
			if(!Map[temp]) Map[temp] = 1;
		}
	}
	cout<<Map.size()<<endl;
}

int main()
{
	int T, times = 0;
	scanf("%d%*c", &T);
	while(T--)
	{
		printf("Case %d: ", ++times);
		solve();
	}
	return 0;
}

抱歉!评论已关闭.