Hat’s Words
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;
}