hdu 1247 字典樹
阿新 • • 發佈:2019-01-29
給定一系列的單詞,少於50000個,輸出這些單詞中由兩個出現過的單片語成的單詞。
開始用gets輸入,無限wrong!猜測可能資料中有空行。
換了scanf就AC了。
#include<bitset> //G++ 15ms #include<map> #include<vector> #include<cstdio> #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<stack> #include<queue> #include<set> #define inf 0x3f3f3f3f #define mem(a,x) memset(a,x,sizeof(a)) using namespace std; typedef long long ll; typedef pair<int,int> pii; inline int in() { int res=0;char c; while((c=getchar())<'0' || c>'9'); while(c>='0' && c<='9')res=res*10+c-'0',c=getchar(); return res; } const int N=1000510; struct Trie { int next[27]; bool flag; void init() { flag=0; mem(next,-1); } }trie[N]; int total; void insert(char *a) { int n=strlen(a); int now=0,tmp,next; for(int i=0;i<n;i++) { tmp=a[i]-'a'; next=trie[now].next[tmp]; if(next==-1) { next=++total; trie[next].init(); trie[now].next[tmp]=next; } now=next; } trie[now].flag=1; } bool ok(char * s,int i,int n) { int now=0,tmp,next; for(;i<n;i++) { tmp=s[i]-'a'; next=trie[now].next[tmp]; if(next==-1) return 0; now=next; } return trie[now].flag; } bool Find(char *s) { int now=0,tmp,next; int n=strlen(s); string t; for(int i=0;i<n;i++) { tmp=s[i]-'a'; if(trie[now].flag) { if(ok(s,i,n)) return 1; } next=trie[now].next[tmp]; now=next; } return 0; } char word[50005][51]; int main() { total=0; trie[0].init(); int i=0; while(~scanf("%s",word[i])) { //if(word[i][0]=='#')break; insert(word[i]); i++; } for(int j=0;j<i;j++) { if(Find(word[j])) { puts(word[j]); } } return 0; }