Skip to content

Commit b158fce

Browse files
committed
Add few spoj problem solutions
1 parent 2ddd10f commit b158fce

8 files changed

+469
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include <iostream>
2+
#include <cstring>
3+
#include <cstdio>
4+
#include <map>
5+
#include <algorithm>
6+
#include <vector>
7+
#include <climits>
8+
#include <utility>
9+
#include <cmath>
10+
using namespace std;
11+
int main(){
12+
int x;
13+
bool ok = true;
14+
while(scanf("%d", &x) == 1){
15+
if(ok){
16+
if(x == 42) ok = false;
17+
else printf("%d\n", x);
18+
}
19+
}
20+
return 0;
21+
}

spoj/16487. Update the array !.cpp

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
#include <iostream>
4+
using namespace std;
5+
typedef long long int Type;
6+
#define MAX_ELEMENTS 100000
7+
#define step(x) ((x)& (-x))
8+
9+
//Range Update Point Query BIT
10+
struct Bit{
11+
int N;
12+
Type ft[MAX_ELEMENTS+1];
13+
Bit(int n):N(n){memset(ft, 0, sizeof(Type)*(N+1));}
14+
void add(int idx, Type v){
15+
while(idx <= N){
16+
ft[idx] += v;
17+
idx += step(idx);
18+
}
19+
}
20+
void init(int n){
21+
N = n;
22+
memset(ft, 0, sizeof(Type)*(N+1));
23+
}
24+
//Returns value at index[idx]
25+
Type query(int idx){
26+
Type s = 0;
27+
while(idx > 0){
28+
s += ft[idx];
29+
idx -= step(idx);
30+
}
31+
return s;
32+
}
33+
//Add value v in range [a...b]
34+
void update(int a, int b, Type v){
35+
add(a, v);
36+
add(b+1, -v);
37+
}
38+
39+
};
40+
int main(){
41+
//freopen("input.txt", "r", stdin);
42+
Bit bit = Bit(MAX_ELEMENTS);
43+
int test, u, n, q, a, b, v;
44+
scanf("%d", &test);
45+
while( test-- ){
46+
scanf("%d %d", &n, &u);
47+
bit.init(n);
48+
while(u--){
49+
scanf("%d %d %d", &a, &b, &v);
50+
a++;b++;
51+
if( b < a) swap(a, b);
52+
bit.update(a, b, v);
53+
}
54+
scanf("%d", &q);
55+
while( q-- ){
56+
scanf("%d", &a);
57+
a++;
58+
printf("%lld\n", bit.query(a));
59+
}
60+
}
61+
return 0;
62+
}

spoj/1684. Frequent values.cpp

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#include <iostream>
2+
#include <cstring>
3+
#include <cstdio>
4+
#include <map>
5+
#include <algorithm>
6+
#include <vector>
7+
#include <climits>
8+
#include <utility>
9+
#include <cmath>
10+
using namespace std;
11+
12+
13+
#define MAX 100000
14+
const int MAX_SEG = 262144+1;
15+
int A[MAX + 1], S[MAX + 2], lo[MAX + 1 ], hi[MAX + 1];
16+
int M[MAX_SEG];
17+
18+
int N, Q;
19+
20+
int built(int node, int b, int e){
21+
if(b == e) return M[node] = A[b];
22+
int mid = (b+e)/2;
23+
int left = node << 1;
24+
int right = left + 1;
25+
26+
M[left] = built( left, b, mid );
27+
M[right] = built( right , mid + 1, e );
28+
29+
return M[node] = max(M[left], M[right]);
30+
31+
32+
}
33+
int query(int node, int b, int e, int i, int j){
34+
if(b >= i && e <= j) return M[node];
35+
if(b > j || e < i) return -1;
36+
37+
int left = query(2*node, b, (b + e)/2, i, j);
38+
int right = query(2*node+1, (b + e)/2 + 1, e, i, j);
39+
if(left == -1) return right;
40+
if(right == -1 )return left;
41+
return max(left, right);
42+
43+
}
44+
int main(){
45+
//freopen("input.txt", "r", stdin);
46+
int st, en;
47+
while(scanf("%d", &N) == 1&& N){
48+
scanf("%d", &Q);
49+
for(int i = 1; i <= N; i++)
50+
scanf("%d", &S[i]);
51+
52+
{
53+
st = 1;
54+
S[N+1] = INT_MIN;
55+
}
56+
for(int i = 1; i <= N + 1; i++){
57+
58+
if(S[i] != S[i+1]){
59+
int width = i - st + 1;
60+
for(int j = st; j <= i; j++){
61+
A[j] = width;
62+
lo[j] = st;
63+
hi[j] = i;
64+
}
65+
st = i + 1;
66+
}
67+
}
68+
69+
70+
int i, j, ans;
71+
built(1, 1, N);
72+
while(Q--){
73+
scanf("%d %d", &st, &en);
74+
ans = 0;
75+
i = hi[st] + 1;
76+
j = lo[en] - 1;
77+
78+
if(hi[st] <= en) ans = max(hi[st] - st +1, ans);
79+
else ans = max(ans, en - st + 1);
80+
81+
if(lo[en] >= st) ans = max(en - lo[en] + 1, ans);
82+
else ans = max(ans, en - st + 1);
83+
84+
if(i < j) ans = max(query(1, 1, N, i, j), ans);
85+
printf("%d\n", ans);
86+
}
87+
}
88+
return 0;
89+
}

spoj/2. Prime Generator.cpp

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#include <algorithm>
2+
#include <bitset>
3+
#include <climits>
4+
#include <cstdio>
5+
#include <cstdlib>
6+
#include <cmath>
7+
#include <iostream>
8+
#include <list>
9+
#include <map>
10+
#include <numeric>
11+
#include <queue>
12+
#include <set>
13+
#include <sstream>
14+
#include <stack>
15+
#include <string>
16+
#include <string.h>
17+
#include <vector>
18+
19+
using namespace std;
20+
const long long int SZ = 31630;
21+
bitset<SZ + 1> sieve;
22+
bitset<100000+10> ans;
23+
vector < int > pl;
24+
void sieveGen(){
25+
pl.push_back(2);
26+
for(int i = 3; i <= SZ; i +=2 ){
27+
if( !sieve.test(i) ){
28+
pl.push_back(i);
29+
for(int k = i + i; k <= SZ; k += i )
30+
sieve.set(k);
31+
}
32+
//printf("%lld\n", i);
33+
}
34+
}
35+
int main(){
36+
#ifndef ONLINE_JUDGE
37+
//freopen("input.txt", "r", stdin);
38+
#endif
39+
sieveGen();
40+
int test, up;
41+
long long int m, n, x;
42+
scanf("%d", &test);
43+
while( test-- ){
44+
scanf("%lld %lld", &m, &n);
45+
up = upper_bound(pl.begin(), pl.end(), sqrt(n)) - pl.begin();
46+
if(up == pl.size() ) up--;
47+
ans.set();
48+
for(int k = 0; k <= up; k++ ){
49+
x = (m / pl[k])*pl[k];
50+
if(x <= pl[k]) x = pl[k] + pl[k];
51+
for(x; x <=n ; x += pl[k] ){
52+
if(x - m < 0)continue;
53+
ans.reset(x - m);
54+
}
55+
}
56+
if( m == 1)ans.reset(0);
57+
for(int k = 0; k <= n - m; k++ ){
58+
if(ans.test(k))printf("%lld\n", k+m);
59+
}
60+
if(test)puts("");
61+
}
62+
return 0;
63+
}

spoj/24. Small factorials.java

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import java.util.Scanner;
2+
import java.math.BigInteger;
3+
public class Main{
4+
public static void main(String[] args) {
5+
Scanner sc = new Scanner(System.in);
6+
int n,test,cs=1;
7+
test = sc.nextInt();
8+
while(test>=cs){
9+
n = sc.nextInt();
10+
11+
BigInteger factorial = BigInteger.ONE;
12+
13+
for (int i=1; i<=n; i++) {
14+
factorial = factorial.multiply(BigInteger.valueOf(i));
15+
}
16+
System.out.println(factorial);
17+
cs=cs+1;
18+
}
19+
20+
21+
}
22+
}

spoj/243. Stable Marriage Problem.cpp

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#include <cstdio>
2+
#include <string.h>
3+
#include <cmath>
4+
#include <queue>
5+
#include <iostream>
6+
#include <algorithm>
7+
#include <climits>
8+
using namespace std;
9+
#define N 503
10+
int bp[N][N];
11+
int gp[N][N];
12+
int b_s[N];
13+
int g_s[N];
14+
bool engaged[N];
15+
int n;
16+
int getRank(int boy, int girl){
17+
for(int i=0;i<n;i++)if(gp[girl][i]==boy)return i;
18+
}
19+
inline void engage(int boy, int girl){
20+
engaged[boy] = true;
21+
g_s[girl] = getRank(boy,girl);
22+
}
23+
24+
int main(){
25+
26+
//freopen("input.txt","r",stdin);
27+
int test,cs=1;
28+
int x;
29+
scanf("%d",&test);
30+
while(test--){
31+
scanf("%d",&n);
32+
33+
for(int i=0;i<n;i++){
34+
scanf("%d",&x);
35+
x--;
36+
for(int j=0;j<n;j++)
37+
{scanf("%d",&gp[x][j]);gp[x][j]--;}
38+
}
39+
40+
for(int i=0;i<n;i++){
41+
scanf("%d",&x);
42+
x--;
43+
for(int j=0;j<n;j++)
44+
{scanf("%d",&bp[x][j]);bp[x][j]--;}
45+
}
46+
47+
48+
49+
memset(engaged,0,sizeof(engaged));
50+
memset(b_s,-1,sizeof(b_s));
51+
memset(g_s,-1,sizeof(g_s));
52+
53+
for(int boy = 0;boy<n;boy++){
54+
if(engaged[boy])continue;
55+
int girl = bp[boy][++b_s[boy]];
56+
if(g_s[girl]==-1)
57+
engage(boy,girl);
58+
else{
59+
int curr_boy_rank = getRank(boy,girl);
60+
int prev_boy_rank = getRank(gp[girl][g_s[girl]],girl);
61+
if(curr_boy_rank<prev_boy_rank){
62+
int dumped_boy = gp[girl][g_s[girl]];
63+
engaged[dumped_boy] = false;
64+
engage(boy,girl);
65+
boy = dumped_boy;
66+
boy--;
67+
continue;
68+
69+
}
70+
else {boy--;continue;}
71+
}
72+
73+
}
74+
//printf("Case %d: ",cs++);
75+
for(int i=0;i<n;i++)printf("%d %d\n",i+1,bp[i][b_s[i]]+1);
76+
}
77+
}

spoj/32. A Needle in the Haystack.cpp

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#include <cstdio>
2+
#include <string>
3+
#include <string.h>
4+
using namespace std;
5+
int M, N;
6+
char pat[1000000+10],txt[10000000+10];
7+
int lps[1000000+10];
8+
void builtFA(){
9+
int i = 1;
10+
int len = 0;
11+
lps[0] = len = 0;
12+
while( i < M){
13+
if( pat[i] == pat[len]){
14+
len++;
15+
lps[i] = len;
16+
i++;
17+
}
18+
else if(len == 0){
19+
lps[i] = 0;
20+
i++;
21+
}
22+
else{
23+
len = lps[len-1];
24+
}
25+
}
26+
}
27+
void KMP(){
28+
int k,i;
29+
for( k = 0, i = 0; i < N; i++ ){
30+
while( k && txt[i] != pat[k] )
31+
k = lps[k-1];
32+
if(txt[i] == pat[k]) k++;
33+
if(k == M){
34+
printf("%d\n", i - M + 1);
35+
k = lps[M-1];
36+
}
37+
}
38+
}
39+
int main(){
40+
bool old = false;
41+
#ifndef ONLINE_JUDGE
42+
freopen("input.txt", "r", stdin);
43+
#endif
44+
while(scanf("%d", &M) == 1){
45+
if(old)puts("");
46+
scanf("%s %s", pat, txt);
47+
N = strlen(txt);
48+
builtFA();
49+
KMP();
50+
old = true;
51+
}
52+
53+
return 0;
54+
}

0 commit comments

Comments
 (0)