字典树模板题
代码
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int tot=1; int root; int trie[100500][30]; int flagg[100500]; int visit[100500]; char s[100500]; char t[10050]; int cnt; void init() { memset(flagg,0,sizeof(flagg)); memset(trie,0,sizeof(trie)); memset(visit,0,sizeof(visit)); tot=1;cnt=0; } void build_trie(char *x) { int len=cnt; root=0; for(int i=0;i<len;i++) { int id=x[i]-'a'+1; if(!trie[root][id]) trie[root][id]=tot++; root=trie[root][id]; } flagg[root]=1; } bool query(char *x) { int len=cnt; root=0; for(int i=0;i<len;i++) { int id=x[i]-'a'+1; if(!trie[root][id]) { return false; } root=trie[root][id]; } if(flagg[root]&&visit[root]==0) { visit[root]=1; return true; } return false; } int main() { while(gets(s)) { if(s[0]=='#') break; init(); int slen=strlen(s); if(s[slen-1]!=' ') s[slen]=' '; for(int i=0;i<=slen;i++) { if(s[i]==' '&&cnt!=0) { build_trie(t);cnt=0; } else if(s[i]!=' ') { t[cnt++]=s[i]; } } int ans=0; for(int i=0;i<=slen;i++) { if(s[i]==' '&&cnt!=0) { int flag=query(t);cnt=0; if(flag) ans++; } else if(s[i]!=' ') { t[cnt++]=s[i]; } } printf("%d ",ans); } }