Skip to content

Commit 98f94c1

Browse files
committed
ICPC Regional Tianjin 2012: HDOJ 4431 - 4441
1 parent a88140f commit 98f94c1

File tree

9 files changed

+880
-0
lines changed

9 files changed

+880
-0
lines changed

HDOJ/hdu_2222.cpp

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
#include <iostream>
2+
#include <string>
3+
#include <cstring>
4+
#include <queue>
5+
#include <vector>
6+
#include <cstdio>
7+
8+
using namespace std;
9+
10+
11+
struct acnode {
12+
int to[26];
13+
int f, cnt;
14+
acnode () {
15+
memset (to, -1, sizeof (to));
16+
f = cnt = 0;
17+
}
18+
}au[250011];
19+
20+
int mempt;
21+
int sm[500011];
22+
bool st[500011];
23+
24+
25+
void getFailPt () {
26+
queue<int>q;
27+
int i, j, k, t;
28+
29+
for (int i = 0; i < 26; ++i) {
30+
if (au[0].to[i]) {
31+
j = au[0].to[i];
32+
q.push (j);
33+
au[j].f = 0;
34+
}
35+
}
36+
37+
while (!q.empty()) {
38+
int hd = q.front ();
39+
q.pop ();
40+
for (i = 0; i < 26; ++i) {
41+
if (au[hd].to[i] != -1) {
42+
int k = au[hd].to[i], cur = hd;
43+
q.push (k);
44+
for (cur = au[cur].f; cur && au[cur].to[i] == -1; cur = au[cur].f);
45+
au[k].f = (j = au[cur].to[i]);
46+
}
47+
}
48+
}
49+
}
50+
51+
void insert (char *t) {
52+
int i, j, k, id, tn = strlen (t), cur = 0;
53+
for (i = 0; i < tn; ++i) {
54+
int lab = t[i] - 'a';
55+
if (au[cur].to[lab] != -1) cur = au[cur].to[lab];
56+
else {
57+
au[id = (mempt ++)] = acnode ();
58+
au[cur].to[lab] = id; cur = id;
59+
}
60+
}
61+
sm[cur]++;
62+
}
63+
64+
void init (){
65+
mempt = 0;
66+
memset (sm, 0, sizeof (sm));
67+
memset (st, false, sizeof (st));
68+
au[mempt++] = acnode ();
69+
}
70+
71+
int getMatchNO (char *s) {
72+
int sn = strlen (s), ans = 0;;
73+
int cur = 0, j, k;
74+
for (int i = 0; i < sn; ++i) {
75+
int lab = s[i] - 'a';
76+
if ((j = au[cur].to[lab]) != -1)
77+
cur = j;
78+
else {
79+
for (cur = au[cur].f; cur && au[cur].to[lab] == -1; cur = au[cur].f);
80+
cur = au[cur].to[lab];
81+
}
82+
for (int up = cur; up; up = au[up].f)
83+
st[up] = true;
84+
}
85+
for (int i = 1; i < mempt; ++i)
86+
if (st[i])
87+
ans += sm[i];
88+
return ans;
89+
}
90+
91+
92+
93+
char s[1000011];
94+
int main () {
95+
int i, j, k, T, sn;
96+
97+
for (scanf ("%d", &T); T; --T) {
98+
scanf ("%d", &k); getchar ();
99+
init ();
100+
for (; k; --k) {
101+
scanf ("%s", s);
102+
insert (s);
103+
}
104+
for (int i = 0; i < 26; ++i)
105+
if (au[0].to[i] == -1) au[0].to[i] = 0;
106+
getFailPt ();
107+
108+
scanf ("%s", s);
109+
printf ("%d\n", getMatchNO (s));
110+
}
111+
return 0;
112+
}
113+
114+
115+

HDOJ/hdu_4407.cpp

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
#include <cstdio>
2+
#include <map>
3+
#include <cstring>
4+
#include <algorithm>
5+
6+
using namespace std;
7+
8+
const int N = 400010;
9+
const int MG = 7;
10+
11+
map<int, int> cg;
12+
13+
int pm[N], pmN;
14+
bool isP[N];
15+
int last[N];
16+
17+
void genPrime () {
18+
int i, j, k;
19+
memset (isP, true, sizeof (isP));
20+
last[1] = 1;
21+
for (i = 2; i <= 700; ++i) {
22+
if (isP[i]){
23+
pm[++pmN] = i; last[i] = i;
24+
for (j = i * i; j <= 400000; j += i) {
25+
isP[j] = false;
26+
last[j] = i;
27+
}
28+
}
29+
}
30+
for (; i <= 400000; ++i)
31+
if (isP[i]) {
32+
pm[++pmN] = i;
33+
last[i] = i;
34+
}
35+
}
36+
37+
int fLst[300000], fn;
38+
int xx;
39+
long long sum;
40+
41+
void DFS (int x, int cnt, int pd) {
42+
if (x == fn + 1) {
43+
long long num = xx / pd;
44+
sum += (num * num + num) / 2 * pd * (cnt % 2 == 1 ? 1 : -1);
45+
return;
46+
}
47+
48+
DFS (x + 1, cnt, pd);
49+
if (pd * fLst[x] <= xx)
50+
DFS (x + 1, cnt + 1, pd * fLst[x]);
51+
}
52+
53+
long long solve (int x) {
54+
int i;
55+
56+
sum = 0;
57+
xx = x;
58+
DFS (1, 0, 1);
59+
60+
return - sum;
61+
}
62+
63+
int gcd (int x, int y) {
64+
int r = x % y;
65+
while (r) {
66+
x = y; y = r; r = x % y;
67+
}
68+
return y;
69+
}
70+
71+
int main () {
72+
int i, j, k;
73+
int n, m, ca;
74+
genPrime ();
75+
76+
for (scanf ("%d", &ca); ca; --ca) {
77+
cg.clear ();
78+
for (scanf ("%d%d", &n, &m); m; --m) {
79+
int ins, l, r, p;
80+
scanf ("%d", &ins);
81+
if (ins == 1) {
82+
scanf ("%d%d%d", &l, &r, &p);
83+
fn = 0; int t = p;
84+
while (t != 1) {
85+
fLst[++fn] = last[t];
86+
t /= last[t];
87+
}
88+
89+
sort (fLst + 1, fLst + fn + 1);
90+
fn = unique (fLst + 1, fLst + fn + 1) - fLst - 1;
91+
92+
long long ans = solve (r) - solve (l - 1);
93+
map<int,int>::iterator it;
94+
for (it = cg.begin (); it != cg.end(); it++)
95+
{
96+
int x = it->first, y = it->second;
97+
if (x >= l && x <= r) {
98+
ans += gcd (y, p) == 1 ? y : 0;
99+
ans -= gcd (x, p) == 1 ? x : 0;
100+
}
101+
}
102+
printf ("%I64d\n", ans);
103+
}
104+
else {
105+
scanf ("%d%d", &l, &r);
106+
cg[l] = r;
107+
}
108+
}
109+
}
110+
return 0;
111+
}
112+

HDOJ/hdu_4411.cpp

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#include <cstdio>
2+
#include <algorithm>
3+
#include <cstring>
4+
#include <queue>
5+
6+
using namespace std;
7+
8+
const int N = 500;
9+
const int M = 30000;
10+
const int maxDist = 200000;
11+
int nxt[M], to[M], c[M], f[M], w[M];
12+
int eb[N], en;
13+
int pre[N], inc[N];
14+
15+
void adde (int x, int y, int cap, int wt) {
16+
to[en] = y; c[en] = cap; f[en] = 0; w[en] = wt; nxt[en] = eb[x];
17+
eb[x] = en ++;
18+
19+
to[en] = x; c[en] = 0; f[en] = 0; w[en] = - wt; nxt[en] = eb[y];
20+
eb[y] = en ++;
21+
}
22+
23+
int dis[N];
24+
25+
bool bellman_ford (int ss, int tt) {
26+
queue<int> q; bool st[N] = {false};
27+
int i, j;
28+
29+
for (i = 0; i < N; ++i) {
30+
dis[i] = maxDist;
31+
pre[i] = -1;
32+
}
33+
dis[ss] = 0; st[ss] = true; inc[ss] = maxDist;
34+
35+
q.push (ss);
36+
37+
while (!q.empty ()) {
38+
i = q.front ();
39+
for (int e = eb[i]; e != -1; e = nxt[e]) {
40+
j = to[e];
41+
if (c[e] > f[e] && dis[i] + w[e] < dis[j]) {
42+
dis[j] = dis[i] + w[e];
43+
inc[j] = min (inc[i], c[e] - f[e]);
44+
pre[j] = e;
45+
if (!st[j]) {
46+
q.push (j);
47+
st[j] = true;
48+
}
49+
}
50+
}
51+
st[i] = false;
52+
q.pop ();
53+
}
54+
return (dis[tt] != maxDist);
55+
}
56+
57+
int MinCostFlow (int ss, int tt) {
58+
int ans = 0;
59+
while (bellman_ford (ss, tt)) {
60+
int i = tt;
61+
while (i != ss) {
62+
int e = pre[i];
63+
f[e] += inc[tt];
64+
f[e^1] -= inc[tt];
65+
i = to[e^1];
66+
}
67+
ans += inc[tt] * dis[tt];
68+
}
69+
return ans;
70+
}
71+
72+
int ad[110][110];
73+
74+
inline int ff (int x) { return 2 * x - 1;}
75+
inline int ss (int x) { return 2 * x;}
76+
77+
int main () {
78+
int i, j, k, n, m, np;
79+
80+
freopen ("in", "r", stdin);
81+
82+
while (scanf ("%d%d%d", &n, &m, &np) == 3 && (n + m + np)) {
83+
for (i = 0; i <= n; ++i)
84+
for (j = 0; j <= n; ++j)
85+
ad[i][j] = (i == j ? 0 : maxDist);
86+
87+
for (; m; --m) {
88+
scanf ("%d%d%d", &i, &j, &k);
89+
ad[i][j] = ad[j][i] = min (ad[i][j], k);
90+
}
91+
92+
for (k = 0; k <= n; ++k)
93+
for (i = 0; i <= n; ++i)
94+
for (j = 0; j <= n; ++j)
95+
ad[i][j] = min (ad[i][j], ad[i][k] + ad[k][j]);
96+
97+
int src = 2 * n + 1, des = 2 * n + 2;
98+
99+
memset (eb, -1, sizeof (eb));
100+
en = 0;
101+
102+
int maxF = 50;
103+
for (i = 1; i <= n; ++i) {
104+
adde (0, ff (i), maxF, ad[0][i]);
105+
adde (ss(i), des, maxF, ad[i][0]);
106+
107+
adde (ff(i), ss(i), 1, -maxDist);
108+
109+
for (j = i + 1; j <= n; j++)
110+
adde (ss(i), ff(j), maxF, ad[i][j]);
111+
}
112+
adde (src, 0, np, 0);
113+
adde (0, des, np, 0);
114+
printf ("%d\n", MinCostFlow (src, des) + n * maxDist);
115+
}
116+
return 0;
117+
}

0 commit comments

Comments
 (0)