| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
付个代码吧In Reply To:终于过了,两个hash表,判重很容易想到hash,排序也很容易想到hash赋rank值,再依次求hash值,其实感觉可以直接三hash判断字典中是否有该字符串及其变形的,但懒得写了 Posted by:HH_YT at 2012-08-15 08:42:03 #include<stdio.h>
#include<string.h>
bool hash[1080];
char str2[1080][51];
int rank[20001];
char ranklist[20001][51];
char stack[1007][51];
int snum;
int r;
struct D
{
int flag;
D* next[26];
char str[51];
}*dic[26];
int init(D *d)
{
for(int i=0;i<=25;i++)
d->next[i]=NULL;
d->flag=0;
return 0;
}
int in(char *str)
{
int i;
int value=0;
for(i=0;str[i]!=0;i++)
{
value*=26;
value+=str[i]-'a';
value%=1080;
}
while(hash[value]!=0&&strcmp(str,str2[value])!=0)
{
value++;
value%=1080;
}
if(hash[value]==0)
{
hash[value]=1;
strcpy(str2[value],str);
return 0;
}
else
{
return 1;
}
return 0;
}
int putrank(char *str)
{
int i;
int value=0;
for(i=0;str[i]!=0;i++)
{
value*=26;
value+=str[i]-'a';
value%=20000;
}
while(rank[value]!=0&&strcmp(ranklist[value],str)!=0)
{
value++;
value%=20000;
}
rank[value]=++r;
strcpy(ranklist[value],str);
return 0;
}
int putin(char *str)
{
int i;
putrank(str);
if(dic[str[0]-'a']==NULL)
{
dic[str[0]-'a']=new D;
init(dic[str[0]-'a']);
}
D *p=dic[str[0]-'a'];
for(i=1;str[i]!='\0';i++)
{
if(p->next[str[i]-'a']==NULL)
{
p->next[str[i]-'a']=new D;
init(p->next[str[i]-'a']);
}
p=p->next[str[i]-'a'];
}
p->flag=1;
memcpy(p->str,str,sizeof(str));
return 0;
}
int check(char *str)
{
D *p=NULL;
int j;
int flag=0;
int f;
flag=0;
f=1;
for(j=0;str[j]!=0;j++)
{
if(flag==0)
{
p=dic[str[j]-'a'];
flag=1;
}
else
p=p->next[str[j]-'a'];
if(p==NULL)
{
f=0;
break;
}
}
if(p!=NULL&&f==1&&p->flag==1)
{
return 1;
}
return 0;
}
int delet(char *str)
{
int i,j;
char str1[51];
int len1=0;
for(i=0;str[i]!=0;i++)
{
len1=0;
for(j=0;str[j]!=0;j++)
{
if(j==i)
continue;
str1[len1++]=str[j];
}
str1[len1]=0;
if(!in(str1)&&check(str1))
strcpy(stack[++snum],str1);
}
return 0;
}
int change(char *str)
{
int i,k;
char str1[51];
for(i=0;str[i]!=0;i++)
{
strcpy(str1,str);
for(k=0;k<=25;k++)
{
str1[i]=k+'a';
if(!in(str1)&&check(str1))
strcpy(stack[++snum],str1);
}
}
return 0;
}
int insert(char *str)
{
D *p;
int i,m;
int j,k;
int flag=0;
int f,step;
int len=strlen(str);
char str1[51];
str[len+1]=0;
int len1=0;
for(i=0;i<=len;i++)
{
f=0;
len1=0;
for(j=0;j<=len;j++)
{
if(j==i)
{
f=1;
for(k=0;k<=25;k++)
{
len1=j;
str1[len1++]=k+'a';
for(m=j;m<=len;m++)
{
str1[len1++]=str[m];
}
str1[len1]=0;
if(!in(str1)&&check(str1))
strcpy(stack[++snum],str1);
}
}
str1[len1++]=str[j];
if(f==1)
break;
}
}
return 0;
}
int getrank(char *str)
{
int i;
int value=0;
for(i=0;str[i]!=0;i++)
{
value*=26;
value+=str[i]-'a';
value%=20000;
}
while(rank[value]==0||strcmp(ranklist[value],str)!=0)
{
value++;
value%=20000;
}
return rank[value];
}
int sor()
{
int i,j,array[1080];
char str[51];
for(i=1;i<=snum;i++)
array[i]=getrank(stack[i]);
for(i=1;i<=snum;i++)
for(j=i+1;j<=snum;j++)
{
if(array[i]>array[j])
{
int temp=array[i];
array[i]=array[j];
array[j]=temp;
strcpy(str,stack[i]);
strcpy(stack[i],stack[j]);
strcpy(stack[j],str);
}
}
for(i=1;i<=snum;i++)
printf(" %s",stack[i]);
return 0;
}
int find(char *str)
{
if(check(str))
{
printf("%s is correct\n",str);
return 0;
}
printf("%s:",str);
delet(str);
change(str);
insert(str);
sor();
printf("\n");
return 0;
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
char str[51];
int flag=0;
for(int i=0;i<=25;i++)
dic[i]=NULL;
memset(rank,0,sizeof(rank));
r=0;
while(scanf("%s",str)!=EOF)
{
if(str[0]=='#')
{
if(flag==0)
flag=1;
else
break;
continue;
}
if(flag==0)
{
putin(str);
}
if(flag==1)
{
r=0;
memset(hash,0,sizeof(hash));
snum=0;
find(str);
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator