您的位置:首页 > 其它

hdu 2846 统计给定字符串是多少字符串的子串

2015-09-15 21:42 453 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846

给定一些字符串,约10000个,给定q的询问,每次询问有一个字符串,判断这个字符串是多少字符串的子串。

字典树处理,把给定字符串的每个后缀都插入字典树,要注意不要把相同的子串重复计数了,因此设置一个id标记,判断之前一个计数是不是当前字符串计数的。

另外字典树的数组要设置的大一些,,,不然会TLE。

#include<bitset>  //G++ 109 ms
#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=1000010;

struct trie
{
int next[27];
bool flag;
int num,id;
void init()
{
flag=0;
num=0;
id=-inf;
mem(next,-1);
}
}trie
;

char word[22];
int tot;

void insert(int i,int id,int n)
{

int now=0,tmp,next;
for(;i<n;i++)
{
tmp=word[i]-'a';
next=trie[now].next[tmp];
if(next==-1)
{
next = ++tot;
trie[next].init();
trie[now].next[tmp]=next;
}
if(trie[now].id!=id)
{
trie[now].id=id;
trie[now].num++;
}
now=next;
}
if(trie[now].id!=id)
{
trie[now].id=id;
trie[now].num++;
}
trie[now].flag=1;

}

int query()
{
int n=strlen(word);
int now=0,tmp,next;
for(int i=0;i<n;i++)
{
tmp=word[i]-'a';
next=trie[now].next[tmp];
if(next==-1) return 0;
now=next;
}
return trie[now].num;
}

int main()
{
int T=in();
tot=0;

trie[0].init();

while(T--)
{
gets(word);
int n=strlen(word);
for(int i=0;i<n;i++)
insert(i,T,n);
}
int q=in();
while(q--)
{
gets(word);
printf("%d\n",query());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: