http://poj.org/problem?id=3007

题意 :给你一个字符串,让你无论从什么地方分割,把这个字符串分成两部分s1和s2,然后再求出s3和s4,让你进行组合,看能出来多少种不同的形式。

思路 :记得以前的时候就听他们讨论这道题,说是用map做会超时,所以我直接就没用map。。。。但是做这道题实在是太波折了,昨天晚上改了一晚上都不对,就是不知道哪里出了问题,今早上又改,改来改去才知道原来我new node后边缺了个括号,我很懵懂,我记得不用括号也行啊,而且我看到一个AC的代码就是没用括号,但是不加就不对,终于用了链地址法改对了能运行了,交上去因为数组开小了就越界了............然后又因为忘了删掉我在代码中加的测试的输出,所以Output Limit Exceeded了一次.............

这个题主要是处理好冲突就行了。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <string>
using namespace std ; struct node
{
char ch1[] ;
struct node *next ;
}*hash[] ; int cnt ; void hashh(char *ch,char *sh)
{
char str[] ;
strcpy(str,ch) ;
strcat(str,sh) ;
int len = strlen(str) ;
int sum = ;
for(int i = ; i < len ; i++)
sum += (str[i]*i) ;
if(!hash[sum])
{
node *p= new node() ;
strcpy(p->ch1,str) ;
hash[sum] = p ;
cnt++ ;
}
else
{
node *p = hash[sum] ;
if(!strcmp(p->ch1,str)) return ;
else
{
while(p->next)
{
if(!strcmp(p->next->ch1,str)) return ;
p = p->next ;
}
node *q = new node() ;
strcpy(q->ch1,str) ;
p->next = q ;
cnt++ ;
}
}
return ;
}
int main()
{
int n ;
scanf("%d",&n) ;
char str[],str1[],str2[],str3[],str4[] ;
while(n--)
{
cnt = ;
memset(hash,,sizeof(hash)) ;
scanf("%s",str) ;
int len = strlen(str) ;
for(int i = ; i < len ; i++)
{
int j = , k = ;
for( ; j < i ; j++)
str1[j] = str[j] ;
str1[j] = '\0' ;
for(j = i ; j < len ; j++)
str2[k++] = str[j] ;
str2[k] = '\0' ;
strcpy(str3,str1) ;
strcpy(str4,str2) ;
reverse(str3,str3+i) ;
reverse(str4,str4+k) ;
// printf("%s %s %s %s\n",str1,str2,str3,str4) ;
hashh(str1,str2) ;
hashh(str3,str2) ;
hashh(str1,str4) ;
hashh(str3,str4) ;
hashh(str2,str1) ;
hashh(str2,str3) ;
hashh(str4,str1) ;
hashh(str4,str3) ;
}
printf("%d\n",cnt) ;
}
return ;
}
05-11 09:23