题意:给出两个文本,问第二个文本某个字符串为前缀的单词数量(第一个文本中)
思路:map大法好,但不利于学算法,字典树可做
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<list>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<numeric>
#include<functional>
using namespace std;
typedef long long ll;
const int maxn = 1e6+5;
struct data
{
int val;
int next[26];
}node[maxn];
int cnt,ans;
char s[maxn];
void init(int i)
{
node[i].val = 0;
memset(node[i].next,-1,sizeof node[i].next);
}
void add(int x,int w)
{
node[w].val++;
if(s[x] == '\0')
return;
if(node[w].next[s[x]-'a'] == -1)
{
init(cnt);
node[w].next[s[x]-'a'] = cnt;
cnt++;
add(x+1,cnt-1);
}
else
add(x+1,node[w].next[s[x]-'a']);
}
void fid(int x,int w)
{
if(s[x] == '\0')
{
ans = node[w].val;
return;
}
if(node[w].next[s[x]-'a'] == -1)
return;
else
fid(x+1,node[w].next[s[x]-'a']);
}
int main(void)
{
init(0);
cnt = 1;
while(gets(s))
{
if(s[0] == '\0') break;
add(0,0);
}
while(gets(s))
{
ans = 0;
fid(0,0);
printf("%d\n",ans);
}
return 0;
}