比较麻烦的trie。
首先你需要选择针对n还是m建立trie,这里我选择了针对n。
那么就需要面临卡空间的问题。
这里提供了一种链式前向星的方法能够当你不会指针trie的时候卡过空间。(做法看代码吧)
然后针对m进行在trie上的dfs即可。
对于相同字符或?来说,trie下移1位,匹配串移动1位。
对于*来说,trie下移,匹配串移动0~长度位。
(合计这道题就难在模拟上了)
#include#include #include #include using namespace std;const int maxn=600001;char s[21];struct node{ char se; int to; int nxt; vector ed;}edge[maxn];int head[maxn],cnt=0,cnt1=1;void add(int u,char c){ cnt++;cnt1++; edge[cnt].se=c; edge[cnt].to=cnt1; edge[cnt].nxt=head[u]; head[u]=cnt; return;}void insert(int k){ int u=1; int l=strlen(s); for(int i=0;i