2009-04-25 07:14:29來源不明

ACM 417 Word Index

作法1:建表
作法2:數學解(巴斯卡)
(巴斯卡請參考 ZeroJudge d209: 古代神祕文字 解答:古代神秘文字)
題目有點類似 不過我懶得修改了

/*******************作法1*********************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int abc[83683][6]={0};
main()
{
 int top=1,a,b,c,d,e;
 for(a=1;a<=26;a++)
  {abc[top][0]=a;top++;}
 for(a=1;a<=26;a++)
  for(b=a+1;b<=26;b++)
   {abc[top][0]=a;abc[top][1]=b;top++;}
 for(a=1;a<=26;a++)
  for(b=a+1;b<=26;b++)
   for(c=b+1;c<=26;c++)
     {abc[top][0]=a;abc[top][1]=b;abc[top][2]=c;top++;}
 for(a=1;a<=26;a++)
  for(b=a+1;b<=26;b++)
   for(c=b+1;c<=26;c++)
    for(d=c+1;d<=26;d++)
     {abc[top][0]=a;abc[top][1]=b;abc[top][2]=c;abc[top][3]=d;top++;}
 for(a=1;a<=26;a++)
  for(b=a+1;b<=26;b++)
   for(c=b+1;c<=26;c++)
    for(d=c+1;d<=26;d++)
     for(e=d+1;e<=26;e++)
     {abc[top][0]=a;abc[top][1]=b;abc[top][2]=c;abc[top][3]=d;abc[top][4]=e;top++;}
 char x[10];
 while(scanf("%s",x)==1)
  {
   int temp[10]={0},flag=0;
   for(a=0;a<strlen(x);a++)
    {
     temp[a]=x[a]-'a'+1;
     if(x[a]>=x[a+1]&&a+1<strlen(x)) flag=1;
    }
    if(flag==1) printf("0\n");
    else
      {
       for(a=1;a<=83682;a++)
        {
         for(b=0;b<5;b++)
          if(abc[a][b]!=temp[b]) break;
         if(b==5) {printf("%d\n",a);break;} 
        }
      }
  }
 return 0;
}