【HDOJ 5384】Danganronpa
阿新 • • 發佈:2017-06-17
href 這不 i++ div 代碼 can .cn emp else
【HDOJ 5384】Danganronpa
AC自己主動機。
。。
當時感覺用字典樹 標神也往自己主動機想來著。。手太生加上時間緊迫也沒敲……回來一看題解什麽AB同一時候建自己主動機。。。頓時楞了 什麽叫同一時候建= =問了問財神說普通自己主動機。
。
。B串單建 立刻瘋了……這不就是模板題麽。。
。 B串建自己主動機 A串枚舉查詢 寫完興沖沖1T……立刻想法優化 建fail時壓縮一下 查詢時直接累計 不再循環找fail 171ms。。
。第二個自己主動機的題。。距上次蠻久了 這次一復習 感覺印象差點兒相同有了
代碼(模板)例如以下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
typedef struct Node
{
int ch[26],cnt,fail;
}Node;
Node tr[2600011];
char a[100001][10002];
int tp;
int SetNode()
{
memset(tr[tp].ch,-1,sizeof(tr[tp].ch));
tr[tp].cnt = 0;
return tp++;
}
void Add(int site,char *str)
{
int i,k;
for(i = 0; str[i]; ++i)
{
k = tr[site].ch[str[i] - ‘a‘];
if(k == -1) tr[site].ch[str[i] - ‘a‘] = k = SetNode();
site = k;
}
tr[site].cnt++;
}
void Build_AC(int site)
{
queue <int> q;
q.push(site);
int i,tmp;
while(!q.empty())
{
site = q.front();
q.pop();
for(i = 0; i < 26; ++i)
{
if(tr[site].ch[i] == -1) continue;
if(!site) tr[tr[site].ch[i]].fail = 0;
else
{
tmp = tr[site].fail;
while(tmp && tr[tmp].ch[i] == -1) tmp = tr[tmp].fail;
tr[tr[site].ch[i]].fail = (tr[tmp].ch[i] == -1)? tmp: tr[tmp].ch[i];
if(tr[tmp].ch[i] != -1) ///壓縮計數器
tr[tr[site].ch[i]].cnt += tr[tr[tmp].ch[i]].cnt;
}
q.push(tr[site].ch[i]);
}
}
}
int Search(int site,char *str)
{
int i,k,ans = 0;
for(i = 0; str[i]; ++i)
{
k = str[i] - ‘a‘;
while(site && tr[site].ch[k] == -1) site = tr[site].fail;
if(tr[site].ch[k] != -1) site = tr[site].ch[k];
ans += tr[site].cnt;
}
return ans;
}
int main()
{
int t,na,nb,i;
char str[100005];
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&na,&nb);
tp = 0;
SetNode();
for(i = 0; i < na; ++i)
{
scanf("%s",a[i]);
}
while(nb--)
{
scanf("%s",str);
Add(0,str);
}
Build_AC(0);
for(i = 0; i < na; ++i)
{
printf("%d\n",Search(0,a[i]));
}
}
return 0;
}
【HDOJ 5384】Danganronpa