Skip to content

Commit b12ec86

Browse files
committed
pku added
1 parent c01789d commit b12ec86

File tree

6 files changed

+492
-0
lines changed

6 files changed

+492
-0
lines changed

PKU/PKU_1904_King.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Reduce to SCC.
3+
*/
4+
#include <cstdio>
5+
#include <cstring>
6+
#include <algorithm>
7+
#include <vector>
8+
using namespace std;
9+
10+
const int N = 4010;
11+
const int M = 1000000;
12+
13+
int to[M], nxt[M];
14+
int eb[N], en;
15+
int scc_no[N], scc_low[N], scc_vis[N], st[N], top, n, m, sccN, stamp;
16+
bool in_stack[N];
17+
18+
int matchx[N], matchy[N];
19+
20+
inline void adde (int x, int y) {
21+
to[en] = y, nxt[en] = eb[x];
22+
eb[x] = en++;
23+
}
24+
25+
void DFS (int x) {
26+
int i, j, k;
27+
scc_vis[x] = scc_low[x] = ++ stamp;
28+
in_stack[st[++top] = x] = true;
29+
for (int ee = eb[x]; ee != -1; ee = nxt[ee]) {
30+
j = to[ee];
31+
if (!scc_vis[j]) {
32+
DFS (j);
33+
scc_low[x] = min (scc_low[x], scc_low[j]);
34+
}
35+
else if (in_stack[j])
36+
scc_low[x] = min (scc_low[x], scc_vis[j]);
37+
}
38+
if (scc_low[x] == scc_vis[x]) {
39+
sccN ++;
40+
do {
41+
scc_no[k = st[top--]] = sccN;
42+
in_stack[k] = false;
43+
} while (k != x);
44+
}
45+
}
46+
47+
int main () {
48+
int i, j, k, nn;
49+
memset (eb, -1, sizeof (eb));
50+
en = 0;
51+
scanf ("%d", &nn); n = nn * 2;
52+
for (int p = 1; p <= nn; p ++) {
53+
for (scanf ("%d", &k); k; k--) {
54+
scanf ("%d", &j);
55+
adde (p, j + nn);
56+
}
57+
}
58+
for (i = 1; i <= nn; i++) {
59+
scanf ("%d", &j);
60+
matchx[i] = j + nn, matchy[j + nn] = i;
61+
adde (j + nn, i);
62+
}
63+
for (i = 1; i <= n; i++) if (!scc_vis[i]) DFS (i);
64+
for (i = 1; i <= nn; i++) {
65+
int ans[N], cnt = 0;
66+
for (int ee = eb[i]; ee != -1; ee = nxt[ee]) {
67+
j = to[ee];
68+
int yy = matchx[i], xx = matchy[j];
69+
if (scc_no[xx] == scc_no[yy]) ans[++cnt] = j - nn;
70+
}
71+
sort (ans + 1, ans + cnt + 1);
72+
printf ("%d", cnt);
73+
for (j = 1; j <= cnt; j++)
74+
printf (" %d", ans[j]);
75+
printf ("\n");
76+
}
77+
return 0;
78+
}
79+
80+
81+

PKU/PKU_2774_DAWG.cpp

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
#include <algorithm>
4+
#include <string>
5+
#include <iostream>
6+
7+
using namespace std;
8+
9+
class DAWG {
10+
11+
private:
12+
struct state {
13+
int to[26];
14+
int sp;
15+
int ma, mi;
16+
state () {}
17+
state (int _ma) {
18+
ma = _ma;
19+
memset (to, 0, sizeof (to));
20+
}
21+
22+
}*au;
23+
24+
int maxStateNumber, mempt;
25+
string s;
26+
int *pt;
27+
int n;
28+
29+
inline bool isPr (int u, int a) {
30+
int k = au[u].to[a];
31+
return au[u].ma + 1 == au[k].ma;
32+
}
33+
34+
inline bool hasTrans (int u, int a) {
35+
return au[u].to[a] != 0;
36+
}
37+
38+
int split (int pa, int cd, int a) {
39+
int i, j, k, id;
40+
41+
au[id = (mempt++)] = state (au[pa].ma + 1);
42+
au[pa].to[a] = id;
43+
for (i = 0; i < 26; ++i)
44+
au[id].to[i] = au[cd].to[i];
45+
46+
au[id].sp = k = au[cd].sp; au[id].mi = au[k].ma + 1;
47+
au[cd].sp = id; au[cd].mi = au[id].ma + 1;
48+
49+
for (int u = pa; u != 0; ) {
50+
u = au[u].sp;
51+
if (au[u].to[a] == cd && !isPr (u, a))
52+
au[u].to[a] = id;
53+
else break;
54+
}
55+
return id;
56+
}
57+
58+
int update (int u, int a) {
59+
int i, j, k, id;
60+
au[id = (mempt++)] = state (au[u].ma + 1);
61+
au[u].to[a] = id;
62+
63+
for (k = -1; u != 0 && k == -1;) {
64+
u = au[u].sp;
65+
j = au[u].to[a];
66+
67+
if (!j)
68+
au[u].to[a] = id;
69+
else if (isPr (u, a)) {
70+
k = j;
71+
}
72+
else
73+
k = split (u, j, a);
74+
}
75+
if (k == -1) k = 0;
76+
au[id].sp = k;
77+
au[id].mi = au[k].ma + 1;
78+
return id;
79+
}
80+
81+
void init () {
82+
n = s.size ();
83+
maxStateNumber = 2 * n + 11;
84+
mempt = 0;
85+
86+
au = new state [maxStateNumber];
87+
pt = new int [maxStateNumber];
88+
89+
au[mempt++] = state (0);
90+
au[0].mi = 0;
91+
}
92+
93+
public:
94+
int trans (char x) {
95+
return x - 'a';
96+
}
97+
98+
long long numberOfString () {
99+
long long ans = 0;
100+
for (int i = 1; i < mempt; ++i)
101+
ans += au[i].ma - au[i].mi + 1;
102+
return ans;
103+
}
104+
105+
DAWG (const string &t) {
106+
s = t;
107+
init ();
108+
109+
int cur = 0;
110+
for (int i = 0; i < n; ++i) {
111+
pt[i] = update (cur, trans (s[i]));
112+
cur = pt[i];
113+
}
114+
}
115+
116+
int solve (const string &t) {
117+
int tn = t.size ();
118+
int ans = -1, cur = 0, cnt = 0;
119+
for (int i = 0; i < tn; ++i) {
120+
int j = t[i] - 'a';
121+
122+
while (cur && !au[cur].to[j]) {
123+
cur = au[cur].sp;
124+
cnt = au[cur].ma;
125+
}
126+
if (au[cur].to[j]) {
127+
cnt ++;
128+
cur = au[cur].to[j];
129+
}
130+
else cnt = 0;
131+
ans = max (ans, cnt);
132+
}
133+
return ans;
134+
}
135+
};
136+
137+
138+
int main () {
139+
int i, j, k;
140+
string s;
141+
cin >> s;
142+
DAWG G (s);
143+
144+
cin >> s;
145+
cout << G.solve (s) << endl;
146+
147+
148+
return 0;
149+
}
150+

PKU/PKU_2774_SA.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include <cstdio>
2+
#include <algorithm>
3+
#include <cstring>
4+
5+
using namespace std;
6+
7+
const int N = 200010;
8+
9+
char s1[N], s2[N];
10+
int n;
11+
int sa[N], ra[N], tsa[N], *x, *y;
12+
int bu[N];
13+
int h[N];
14+
15+
bool cmp (int *v, int i, int j, int ss) {
16+
return v[i] != v[j] || v[i+ss] != v[j+ss];
17+
}
18+
19+
void suffix_sort () {
20+
21+
int i, m = max (256, n);
22+
x = ra; y = tsa;
23+
memset (bu, 0, sizeof (bu));
24+
for (i = 0; i < n; ++i) bu[x[i] = s1[i]]++;
25+
for (i = 1; i < m; ++i) bu[i] += bu[i-1];
26+
for (i = n - 1; i >= 0; --i) sa[--bu[x[i]]] = i;
27+
28+
for (int ss = 1, p = 0; p < n - 1; ss <<= 1) {
29+
for (i = n - ss, p = 0; i < n; ++i) y[p++] = i;
30+
for (i = 0; i < n; i++) if (sa[i] >= ss) y[p++] = sa[i] - ss;
31+
for (i = 0; i < n; ++i) sa[bu[x[y[i]]]++] = y[i];
32+
bu[0] = 0;
33+
for (swap (x, y), i = 1, x[sa[p = 0]] = 0; i < n; ++i) {
34+
if (cmp (y, sa[i], sa[i-1], ss))
35+
bu[++p] = i;
36+
x[sa[i]] = p;
37+
}
38+
39+
}
40+
}
41+
42+
void cal_height () {
43+
int i, j, k;
44+
for (i = 0; i < n; ++i) ra[sa[i]] = i;
45+
for (k = 0, i = 0; i < n; ++i) if (ra[i] > 1) {
46+
j = sa[ra[i] - 1];
47+
while (s1[i+k] == s1[j+k])k++;
48+
h[ra[i]] = k;
49+
if (k) k--;
50+
}
51+
}
52+
53+
int main () {
54+
int i, j, k;
55+
scanf ("%s", s1); int ls1 = strlen (s1);
56+
scanf ("%s", s2); int ls2 = strlen (s2);
57+
58+
s1[ls1] = '$'; s1[ls1 + 1] = 0;
59+
strcat (s1, s2); n = strlen (s1) + 1;
60+
61+
suffix_sort (); cal_height ();
62+
int ans = -1;
63+
for (i = 0; i < n - 1; ++i) {
64+
if ( (sa[i] < ls1 && sa[i+1] > ls1) || (sa[i] > ls1 && sa[i+1] < ls1))
65+
ans = max (ans, h[i+1]);
66+
}
67+
printf ("%d\n", ans);
68+
return 0;
69+
}
70+
71+
72+
73+

PKU/PKU_2774_SA.cpp~

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* PKU_2774.cpp
3+
*
4+
* Created on: Jul 15, 2012 10:01 am, accepted 10:37 am
5+
* Author: shuo
6+
*/
7+
8+
#include <cstdio>
9+
#include <algorithm>
10+
#include <cstring>
11+
12+
using namespace std;
13+
14+
const int N = 200010;
15+
16+
char s1[N], s2[N];
17+
int n;
18+
int sa[N], ra[N], tsa[N], *x, *y;
19+
int bu[N];
20+
int h[N];
21+
22+
bool cmp (int *v, int i, int j, int ss) {
23+
return v[i] != v[j] || v[i+ss] != v[j+ss];
24+
}
25+
26+
void suffix_sort () {
27+
28+
int i, m = max (256, n);
29+
x = ra; y = tsa;
30+
memset (bu, 0, sizeof (bu));
31+
for (i = 0; i < n; ++i) bu[x[i] = s1[i]]++;
32+
for (i = 1; i < m; ++i) bu[i] += bu[i-1];
33+
for (i = n - 1; i >= 0; --i) sa[--bu[x[i]]] = i;
34+
35+
for (int ss = 1, p = 0; p < n - 1; ss <<= 1) {
36+
for (i = n - ss, p = 0; i < n; ++i) y[p++] = i;
37+
for (i = 0; i < n; i++) if (sa[i] >= ss) y[p++] = sa[i] - ss;
38+
for (i = 0; i < n; ++i) sa[bu[x[y[i]]]++] = y[i];
39+
bu[0] = 0;
40+
for (swap (x, y), i = 1, x[sa[p = 0]] = 0; i < n; ++i) {
41+
if (cmp (y, sa[i], sa[i-1], ss))
42+
bu[++p] = i;
43+
x[sa[i]] = p;
44+
}
45+
46+
}
47+
}
48+
49+
void cal_height () {
50+
int i, j, k;
51+
for (i = 0; i < n; ++i) ra[sa[i]] = i;
52+
for (k = 0, i = 0; i < n; ++i) if (ra[i] > 1) {
53+
j = sa[ra[i] - 1];
54+
while (s1[i+k] == s1[j+k])k++;
55+
h[ra[i]] = k;
56+
if (k) k--;
57+
}
58+
}
59+
60+
int main () {
61+
int i, j, k;
62+
scanf ("%s", s1); int ls1 = strlen (s1);
63+
scanf ("%s", s2); int ls2 = strlen (s2);
64+
65+
s1[ls1] = '$'; s1[ls1 + 1] = 0;
66+
strcat (s1, s2); n = strlen (s1) + 1;
67+
68+
suffix_sort (); cal_height ();
69+
int ans = -1;
70+
for (i = 0; i < n - 1; ++i) {
71+
if ( (sa[i] < ls1 && sa[i+1] > ls1) || (sa[i] > ls1 && sa[i+1] < ls1))
72+
ans = max (ans, h[i+1]);
73+
}
74+
printf ("%d\n", ans);
75+
return 0;
76+
}
77+
78+
79+
80+

0 commit comments

Comments
 (0)