[关闭]
@994495jj 2017-08-18T01:06:41.000000Z 字数 1497 阅读 827

hdu6138

201708 (ACM)字符串----AC自动机


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<"="<<a<<endl;
  10. typedef long long ll;
  11. typedef pair<int, int> pii;
  12. typedef vector<int> vi;
  13. //--------
  14. const int N=101010;
  15. vi has[N];
  16. int lev[N];
  17. struct Trie {
  18. static const int N=101010 , M = 26;
  19. int ne[N][M] , fail[N] , fa[N] , rt , L;
  20. void ini() {
  21. fill_n(ne[fail[0] = N-1],M,0);
  22. L = 0;
  23. rt = newnode();
  24. }
  25. int newnode() {
  26. fill_n(ne[L],M,0);
  27. return L++;
  28. }
  29. void add(char *s,int id) {
  30. int p = rt;
  31. for(int i=0;s[i];++i) {
  32. int c = s[i] - 'a';
  33. if(!ne[p][c]) {
  34. ne[p][c] = newnode();
  35. fa[L-1]=p;
  36. }
  37. p = ne[p][c];
  38. has[id].pb(p);
  39. lev[p]=i+1;
  40. }
  41. }
  42. void Build() {
  43. vi v;v.pb(rt);
  44. rep(i,0,sz(v)) {
  45. int c = v[i];
  46. rep(i,0,M) ne[c][i] ?
  47. v.pb(ne[c][i]) , fail[ne[c][i]] = ne[fail[c]][i] :
  48. ne[c][i] = ne[fail[c]][i];
  49. }
  50. }
  51. }tr;
  52. int n,tim;
  53. int vis[N];
  54. char t[N];
  55. int main() {
  56. int T;scanf("%d",&T);
  57. while(T--) {
  58. ///
  59. scanf("%d",&n);
  60. ///init
  61. tr.ini();
  62. tim=0;
  63. rep(i,0,n+1) has[i].clear();
  64. memset(vis,0,sizeof(vis));
  65. ///read
  66. rep(i,0,n) {
  67. scanf("%s",t);
  68. tr.add(t,i);
  69. }
  70. ///solve
  71. tr.Build();
  72. int m;scanf("%d",&m);
  73. while(m--) {
  74. int u,v;scanf("%d%d",&u,&v);
  75. --u;--v;
  76. vi q;++tim;
  77. for(auto e : has[u]) {
  78. vis[e]=tim;
  79. q.pb(e);
  80. }
  81. rep(i,0,sz(q)) {
  82. int c=q[i];
  83. if(!c) continue;
  84. int e=tr.fail[c];
  85. if(vis[e]!=tim) {
  86. vis[e]=tim;
  87. q.pb(e);
  88. }
  89. }
  90. int ans=0;
  91. q.clear();++tim;
  92. for(auto e : has[v]) {
  93. if(vis[e]==tim-1) ans=max(ans,lev[e]);
  94. vis[e]=tim;
  95. q.pb(e);
  96. }
  97. rep(i,0,sz(q)) {
  98. int c=q[i];
  99. if(!c) continue;
  100. int e=tr.fail[c];
  101. if(vis[e]==tim-1) ans=max(ans,lev[e]);
  102. vis[e]=tim;
  103. q.pb(e);
  104. }
  105. printf("%d\n",ans);
  106. }
  107. }
  108. return 0;
  109. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注