题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2846
题目概述:
给你P个单词以及Q个询问,对于每个询问,回答一个整数,表示询问的字符串是多少个所给的单词的子串。
大致思路:
很容易看出是一个字典树的题,因为只要是子串都满足题意,所以在插入的时候需要多插入一些,例如:
对于单词abcd,则需要插入字符串abcd,bcd,cd,d;
然后插入的时候顺便统计一下个数,这样查询起来就当做正常的字典树查询就可以了。
需要注意的是,对于同一个字符串,插入子串时如果没有新建节点是不要使该节点统计的个数增加的。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cmath> 5 #include <vector> 6 #include <ctime> 7 #include <map> 8 #include <queue> 9 #include <cstring> 10 #include <algorithm> 11 using namespace std; 12 13 #define sacnf scanf 14 #define scnaf scanf 15 #define maxn 1000000 16 #define maxm 26 17 #define inf 1061109567 18 #define Eps 0.001 19 const double PI=acos(-1.0); 20 #define mod 1000000007 21 #define MAXNUM 10000 22 void Swap(int &a,int &b) {int t=a;a=b;b=t;} 23 int Abs(int x) {return (x<0)?-x:x;} 24 typedef long long ll; 25 26 struct node 27 { 28 int num;int cnt; 29 int next[maxm]; 30 } tire[maxn]; 31 32 int c=1; 33 char s[maxm]; 34 35 void Insert(int root,char *s,int n) 36 { 37 while(*s!='