2014/5/25 多校

A:

  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<string.h>
  4 #include<set>
  5 #define maxn 5+8*300000
  6 using namespace std;
  7  
  8 set<int>S;
  9 int Enum=0,score[maxn],son[maxn][26],l[maxn];
 10 bool flag[maxn];//标记是否打星
 11 int tot_score,num,str_len;//个数
 12 char ans_string[15];
 13 char Map[5][5];
 14 bool vis[5][5];
 15 void init(){
 16     tot_score=0;num=0;str_len=0;
 17 }
 18 int newnode(){
 19     Enum++;
 20     memset(son[Enum],0,26*sizeof(son[Enum][0]));
 21     flag[Enum]=false;
 22     score[Enum]=0;
 23     l[Enum]=0;
 24     return Enum;
 25 }
 26 int cal_score(int len){
 27     if (len<=2) return 0;
 28     if (len<=4) return 1;
 29     if (len==5) return 2;
 30     if (len==6) return 3;
 31     if (len==7) return 5;
 32     if (len==8) return 11;
 33 }
 34 void Insert(char *str){
 35     int u=0,len=strlen(str);
 36     for(int i=0;i<len;i++){
 37         int id=str[i]-'A';
 38         if (son[u][id]==0){
 39             son[u][id]=newnode();
 40         }
 41         u=son[u][id];
 42     }
 43     //u是最底层,也代表当前结点
 44     score[u]=cal_score(len);
 45     flag[u]=true;
 46     l[u]=len;
 47 }
 48 int a[][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
 49 char ss[20];
 50 void dfs(int id,int x,int y,int k){
 51  
 52     if (flag[id] && S.count(id)==0){
 53         num++;
 54         S.insert(id);
 55         tot_score+=score[id];
 56         ss[k]='