极限过的 最原始的方法一层一层建树就好了
#include<bits/stdc++.h> using namespace std; int trie[500100][26]={0}; int sum[500100]={0}; bool flag[500100]; int root=0; int pos; void insert1(char *s) { int root=0; for(int i=0;i<strlen(s);i++) { int ch=s[i]-'a'; if( trie[ root ][ch]==0 ) { // memset(trie[pos],0,sizeof(trie[pos]));//用多少初始化多少 trie[root][ch]=pos++; } root=trie[root][ch]; if( !flag[root] ){flag[root]=true;sum[root]++;} } } int find1(char *s) { int root=0; for(int i=0;i<strlen(s);i++) { int ch=s[i]-'a'; if( trie[root][ch]==0 )return 0; root=trie[root][ch]; } return sum[root]; } int main() { pos=1; int n;scanf("%d",&n); char a[20];char s[20]; while(n--) { memset(flag,false,sizeof(flag)); scanf("%s",a); int n1=strlen(a); for(int k=0;k<n1;k++) { strcpy( s , a+k ); insert1(s); } } scanf("%d",&n); while(n--) { scanf("%s",a); printf("%d ",find1(a)); } return 0; }
优化了: 时间节省了600ms
1.去掉flag标记数组 改sum为二维数组 更加方便 学会了标记数组不是只有0,1那么死板 多观察就可以不用memset 节省了大量时间!!!
2.直接 a+k带入 不用strcpy到另外一个数组里去了
#include<bits/stdc++.h> using namespace std; int trie[500100][26]={0}; int sum[500100][2]={0}; bool flag[500100]; int root=0; int pos; void insert1(char *s,int id) { int root=0; for(int i=0;i<strlen(s);i++) { int ch=s[i]-'a'; if( trie[ root ][ch]==0 ) { // memset(trie[pos],0,sizeof(trie[pos]));//用多少初始化多少 trie[root][ch]=pos++; } root=trie[root][ch]; if( sum[root][1]!=id ){sum[root][1]=id;sum[root][0]++;} } } int find1(char *s) { int root=0; for(int i=0;i<strlen(s);i++) { int ch=s[i]-'a'; if( trie[root][ch]==0 )return 0; root=trie[root][ch]; } return sum[root][0]; } int main() { pos=1; int n;scanf("%d",&n); char a[20]; while(n--) { scanf("%s",a); int n1=strlen(a); for(int k=0;k<n1;k++) { insert1(a+k,n); } } scanf("%d",&n); while(n--) { scanf("%s",a); printf("%d ",find1(a)); } return 0; }