Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11314 Accepted Submission(s): 4041
You are to find all the hat’s words in a dictionary.
Only one case.
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 #define mem(x,y) memset(x,y,sizeof(x)) 8 const int INF=0x3f3f3f3f; 9 const double PI=acos(-1.0); 10 const int MAXN=50010; 11 int ch[MAXN][30],word[MAXN],val[MAXN]; 12 char dt[50010][110]; 13 int sz; 14 void initial(){ 15 sz=1; 16 mem(ch[0],0);mem(word,0);mem(val,0); 17 } 18 void join(char *s){ 19 int len=strlen(s),k=0,j; 20 for(int i=0;i<len;i++){ 21 j=s[i]-'a'; 22 if(!ch[k][j]){ 23 mem(ch[sz],0); 24 // val[sz]=0; 25 ch[k][j]=sz++; 26 } 27 k=ch[k][j]; 28 word[k]++; 29 } 30 val[k]=1; 31 } 32 bool find(char *s){ 33 int len=strlen(s),k=0,j; 34 for(int i=0;i<len;i++){ 35 j=s[i]-'a'; 36 k=ch[k][j]; 37 if(!word[k])return false; 38 } 39 if(val[k])return true; 40 else return false; 41 } 42 int main(){ 43 initial(); 44 int t=0; 45 char s[110],l[110],r[110]; 46 while(~scanf("%s",dt[t]))join(dt[t++]); 47 for(int i=0;i<t;i++){ 48 int len=strlen(dt[i]); 49 if(len<=1)continue; 50 for(int j=1;j<len;j++){ 51 strcpy(r,dt[i]+j); 52 strcpy(l,dt[i]); 53 l[j]='\0'; 54 if(find(l)&&find(r)){ 55 puts(dt[i]);break; 56 } 57 } 58 } 59 return 0; 60 }
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; typedef long long LL; #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x) #define PI(x) printf("%d",x) #define P_ printf(" ") const int INF=0x3f3f3f3f; const int MAXN=1000010;//要开的足够大 int ch[MAXN][30]; int word[MAXN]; char str[50010][110]; int val[MAXN]; int sz; int N; char l[110],r[110]; void insert(char *s){ int k=0,j; for(int i=0;s[i];i++){ j=s[i]-'a'; if(!ch[k][j]){ mem(ch[sz],0); ch[k][j]=sz++; } k=ch[k][j]; word[k]++; } val[k]=1; } bool find(char *s){ int k=0,j; for(int i=0;s[i];i++){ j=s[i]-'a'; k=ch[k][j]; if(!word[k])return false; } if(val[k]!=1)return false; return true; } int main(){ int tp=0; sz=1; mem(ch[0],0);mem(val,0);mem(word,0); while(~scanf("%s",str[tp]))insert(str[tp++]); // printf("%d\n",tp); for(int i=0;i<tp;i++){ for(int j=0;str[i][j];j++){ strcpy(l,str[i]); l[j]='\0'; strcpy(r,str[i]+j); // printf("**%s %s\n",l,r); if(find(l)&&find(r)){ puts(str[i]);break; } } } return 0; }