最长的才可能成为答案,那么除了最长的以外全部insert到自动机里,再拿最长的去match,如果match完以后cnt全被清空了,那么这个最长串就是答案。事实上方便起见这个最长串一起丢进去也无妨,而且更好写(时间也没有慢特别多)。

  另外需要注意的一点是init()里头的memset只需要清空之前用过的节点而不是所有节点,这是经常被卡的一点。

  代码如下:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
const int MAX_N = + ;
const int MAX_Tot = + ; struct Aho
{
struct state
{
int nxt[];
int fail,cnt;
}stateTable[MAX_Tot]; int size; queue<int> que; void init()
{
while(que.size()) que.pop();
for(int i=;i<size;i++)
{
memset(stateTable[i].nxt,,sizeof(stateTable[i].nxt));
stateTable[i].fail = stateTable[i].cnt = ;
}
size = ;
} void insert(char *s)
{
int n = strlen(s);
int now = ;
for(int i=;i<n;i++)
{
char c = s[i];
if(!stateTable[now].nxt[c-'a'])
stateTable[now].nxt[c-'a'] = size++;
now = stateTable[now].nxt[c-'a'];
}
stateTable[now].cnt++;
} void build()
{
stateTable[].fail = -;
que.push(); while(que.size())
{
int u = que.front();que.pop();
for(int i=;i<;i++)
{
if(stateTable[u].nxt[i])
{
if(u == ) stateTable[stateTable[u].nxt[i]].fail = ;
else
{
int v = stateTable[u].fail;
while(v != -)
{
if(stateTable[v].nxt[i])
{
stateTable[stateTable[u].nxt[i]].fail = stateTable[v].nxt[i];
break;
}
v = stateTable[v].fail;
}
if(v == -) stateTable[stateTable[u].nxt[i]].fail = ;
}
que.push(stateTable[u].nxt[i]);
}
}
}
} //bool mark[MAX_Tot];
void Get(int u)
{
while(u)
{
if(stateTable[u].cnt == -) break;
stateTable[u].cnt = -;
u = stateTable[u].fail;
}
} int match(char *s)
{
//memset(mark, 0, sizeof mark);
int n = strlen(s);
int res = , now = ;
for(int i=;i<n;i++)
{
char c = s[i];
if(stateTable[now].nxt[c-'a']) now = stateTable[now].nxt[c-'a'];
else
{
int p = stateTable[now].fail;
while(p != - && stateTable[p].nxt[c-'a'] == ) p = stateTable[p].fail;
if(p == -) now = ;
else now = stateTable[p].nxt[c-'a'];
} Get(now);
}
for(int i=;i<size;i++) if(stateTable[i].cnt > ) return ;
return ;
}
}aho; int T,n;
char s[MAX_N], t[MAX_N]; int main()
{
int T;scanf("%d",&T);
while(T--)
{
vector<char> v;
aho.init();
scanf("%d",&n);
int maxn = ;
for(int i=;i<=n;i++)
{
scanf("%s",s);
//aho.insert(s);
int sz = strlen(s);
for(int j=;j<sz;j++) v.push_back(s[j]);
v.push_back('#');
if(sz > maxn)
{
maxn = sz;
strcpy(t, s);
}
}
int tot = ;
for(int i=;i<v.size();i++)
{
if(v[i] == '#')
{
s[tot++] = ;
tot = ;
if(strcmp(s, t)) aho.insert(s);
}
else s[tot++] = v[i];
}
aho.build();
int ans = aho.match(t);
if(ans) puts(t);
else puts("No");
}
}

最新文章

  1. hihocoder-1453-Rikka with Tree
  2. mariadb
  3. Javascript-9-1-OOP-5-链式调用
  4. Linear Algebra lecture8 note
  5. Hibernate4中使用getCurrentSession报Could not obtain transaction-synchronized Session for current thread
  6. Java——文本组件:JTextComponent
  7. 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面
  8. for循环数据节点
  9. 视频播放-VideoVIew,Vitamio
  10. 【Android - 框架】之MVP模式的使用
  11. 错排-HDU 2049 递推的应用
  12. hdu_1495_非常可乐(bfs模拟)
  13. JS 转换数字为大写
  14. alpha-咸鱼冲刺day8-紫仪
  15. Rails里rake db:migrate出现undefined method last_comment问题的解决
  16. Cs231n课堂内容记录-Lecture 5 卷积神经网络介绍
  17. DG_Check检测
  18. CF1098B/CF1099E Nice table
  19. NLog 配置
  20. html5手机web app &lt;input type=&quot;file&quot; &gt; 只调用图库,禁止调用摄像头?

热门文章

  1. usercript and passwdcript array
  2. 11.15java实习生面试总结
  3. linux 下 shell脚本报错:-bash: ./build.sh: /bin/sh^M: bad interpreter: No such file or directory
  4. 浅谈对BFC的认识,以及用bfc解决浮动问题
  5. JS中的迭代器和生成器
  6. 智表ZCELL产品发布企业版
  7. 各种GAN的学习和总结
  8. go语言实现分布式锁
  9. CRM, C4C和SAP Hybris的数据库层设计
  10. UTF-8 中文编码范围