GetCodes: Part-1
GetCodes: Part-1
GetCodes : Part 1
A Noob Programmer’s CodeHub
Aaman007
18
************** Permutaion Generating ***************
for(int i=0;i<n;i++)
characters += ('A'+i);
do
{
for(int i=0;i<n;i++)
cout << characters[i];
cout << endl;
k--;
}
while(next_permutation(characters.begin(),characters.end()) && k);
Page 2
***************** Lowest Common Ancestor *****************
#include<bits/stdc++.h>
using namespace std;
int par[MAX];
int Find(int u)
{
if(par[u] == u)
return u;
return par[u] = Find(par[u]);
}
void Kruskal(int n)
{
for(int i=1;i<=n;i++)
par[i] = i;
int cnt = 0;
sort(vv.begin(),vv.end());
for(int i=0;i<vv.size();i++)
{
int u = vv[i].u , v = vv[i].v , w = vv[i].w;
if(Find(u) != Find(v))
{
par[Find(u)] = Find(v);
cnt++;
adj[u].push_back(pii(v,w));
adj[v].push_back(pii(u,w));
if(cnt == n-1)
break;
}
}
}
Page 3
for(int i=0;i<adj[src].size();i++)
{
int x = adj[src][i].first;
if(x == par)
continue;
M[x][0] = adj[src][i].second;
DFS(x,src,lev+1);
}
}
void initLCA(int n)
{
memset(P,-1,sizeof P);
for(int i=1;i<=n;i++)
P[i][0] = T[i];
for(int j=1;(1<<j)<n;j++)
{
for(int i=1;i<=n;i++)
{
if(P[i][j-1] != -1)
{
P[i][j] = P[P[i][j-1]][j-1];
M[i][j] = max(M[i][j-1],M[P[i][j-1]][j-1]);
}
}
}
}
int query(int u,int v,int n)
{
if(u == v)
return 0;
int log = 1 , mx = 0;
while(1)
{
int next = log+1;
for(int i=log;i>=0;i--)
{
if(dep[u]-(1<<i) >= dep[v])
mx = max(mx,M[u][i]) , u = P[u][i];
}
if(u == v)
return mx;
for(int i=log;i>=0;i--)
{
if(P[u][i] != -1 && P[u][i] != P[v][i])
{
mx = max(mx,max(M[u][i],M[v][i]));
u = P[u][i];
v = P[v][i];
}
}
mx = max(mx,max(M[u][0],M[v][0]));
return mx;
}
void init()
Page 4
{
vv.clear();
for(int i=0;i<MAX;i++)
adj[i].clear();
}
int main()
{
FastRead
int t,cas=1;
cin >> t;
while(t--)
{
init();
int n,m,u,v,w;
for(int i=0;i<m;i++)
{
cin >> u >> v >> w;
vv.push_back(edge(u,v,w));
}
Kruskal(n);
DFS(1,1,0);
initLCA(n);
int q;
cin >> q;
ll cum[MAX];
vector<ll>tree[4*MAX];
merge(tree[left].begin(),tree[left].end(),tree[right].begin(),tree[right].end(),back_inserter
(tree[node]));
}
Page 5
int query(int L,int R,int l,int r,int node,ll t)
{
if(l > R || r < L)
return 0;
else if(l>=L && r<=R)
return lower_bound(tree[node].begin(),tree[node].end(),t)-tree[node].begin();
int mid = (l+r)/2;
return query(L,R,l,mid,2*node,t) + query(L,R,mid+1,r,2*node+1,t);
}
int main()
{
int n;
ll t;
scanf("%d%I64d",&n,&t);
int a[n+2];
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
cum[i] = cum[i-1]+a[i];
}
build(1,n,1);
ll ans = 0;
for(int i=1;i<=n;i++)
ans += query(i,n,1,n,1,cum[i-1]+t);
printf("%I64d\n",ans);
}
Page 6
if(l == r)
{
a[idx] = x;
for(int i=0;i<61;i++)
{
if(Check(a[l],i))
tree[pos].bit[i] = 1;
else
tree[pos].bit[i] = 0;
}
return;
}
int mid = (l+r)/2;
update(l,mid,2*pos,idx,x);
update(mid+1,r,2*pos+1,idx,x);
for(int i=0;i<=60;i++)
tree[pos].bit[i] = tree[2*pos].bit[i]+tree[2*pos+1].bit[i];
return;
}
ll query(int L,int R,int l,int r,int pos,int k)
{
if(l>=L && r<=R)
return tree[pos].bit[k];
else if(l>R || r<L)
return 0;
int mid = (l+r)/2;
int q1 = query(L,R,l,mid,pos*2,k);
int q2 = query(L,R,mid+1,r,pos*2+1,k);
return q1+q2;
}
using namespace std;
int main()
{
int n;
cin >> n;
for(int i=1;i<=n;i++)
cin >> a[i];
build(1,n,1);
int q,type,i,x,l,r,k;
cin >> q;
while(q--)
{
cin >> type;
if(type == 1)
{
cin >> i >> x;
update(1,n,1,i,x);
}
else
{
cin >> l >> r >> k;
cout << query(l,r,1,n,1,k) << endl;
}
}
}
struct data
{
ll prop , sum;
};
data tree[4*MAX];
Page 7
void update(int l,int r,int L,int R,int pos,ll v)
{
if(l > R || r < L)
return;
else if(l >= L && r <= R)
{
tree[pos].prop += v;
tree[pos].sum += (r-l+1)*v;
return;
}
update(l,mid,L,R,left,v);
update(mid+1,r,L,R,right,v);
ll x = query(l,mid,L,R,left,carry+tree[pos].prop);
ll y = query(mid+1,r,L,R,right,carry+tree[pos].prop);
return x+y;
}
void init()
{
for(int i=1;i<4*MAX;i++)
tree[i].prop = tree[i].sum = 0;
}
int main()
{
int t, cas = 1;
scanf("%d",&t);
while(t--)
{
init();
int n,q,type,x,y,v;
scanf("%d%d",&n,&q);
printf("Case %d:\n",cas++);
while(q--)
{
scanf("%d",&type);
if(type)
{
scanf("%d%d",&x,&y);
printf("%lld\n",query(1,n,x+1,y+1,1,0));
}
else
{
scanf("%d%d%d",&x,&y,&v);
update(1,n,x+1,y+1,1,1LL*v);
}
}
}
}
Page 8
************** Trie – Data Structure ************
bool Check(ll n,ll pos) { return (n & (1<<pos)); }
bool Set(ll &n,ll pos) { return n = n | (1<<pos); }
bool Clear(ll &n,ll pos) { return n = n & ~(1<<pos); }
struct trieNode
{
trieNode *one,*zero;
int cnt;
trieNode()
{
one = zero = NULL;
cnt = 0;
}
};
trieNode *root;
void Insert(ll n)
{
trieNode *cur = root;
for(int i=29;i>=0;i--)
{
if(Check(n,i))
{
if(cur->one == NULL)
cur->one = new trieNode();
cur = cur->one;
}
else
{
if(cur->zero == NULL)
cur->zero = new trieNode();
cur = cur->zero;
}
cur->cnt++;
}
}
ll MinimumXor(ll n)
{
trieNode *cur = root;
for(int i=29;i>=0;i--)
{
if(Check(n,i))
{
if(cur->one && cur->one->cnt)
{
Clear(n,i);
cur = cur->one;
}
else
cur = cur->zero;
}
else
{
if(cur->zero && cur->zero->cnt)
cur = cur->zero;
else
{
Set(n,i);
cur = cur->one;
}
}
cur->cnt--;
}
return n;
}
int main()
{
FastRead
Page 9
root = new trieNode();
int n;
cin >> n;
ll a[n+2] , p;
for(int i=0;i<n;i++)
cin >> a[i];
for(int i=0;i<n;i++)
{
cin >> p;
Insert(p);
}
for(int i=0;i<n;i++)
cout << MinimumXor(a[i]) << " ";
cout << endl;
}
Page
10
************** Bitmask DP **************
bool Check(int n,int pos){ return (n & (1<<pos)); }
int Set(int n,int pos){ return (n | (1<<pos)); }
int w[20][20],n;
int dp[(1<<20)+2];
int call(int mask)
{
if(mask == (1<<n)-1)
return 0;
else if(dp[mask] != -1)
return dp[mask];
int &ret = dp[mask];
int ans = 1<<28;
for(int i=0;i<n;i++)
{
if(!Check(mask,i))
{
int price = w[i][i];
for(int j=0;j<n;j++)
{
if(Check(mask,j))
price += w[i][j];
}
price += call(Set(mask,i));
ans = min(ans,price);
}
}
return dp[mask] = ans;
}
int main()
{
cin >> n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin >> w[i][j];
}
}
memset(dp,-1,sizeof dp);
cout << call(0) << endl;
}
int dp[1015][1005];
string s;
char ans[1015];
bool DP(int cur,int modV,int n)
{
if(cur == s.size())
return (modV == 0);
Page
11
for(int i=st;i<=9;i++)
{
ret |= DP(cur+1,(modV*10+i)%n,n);
if(ret)
{
ans[cur] = i+'0';
break;
}
}
return ret;
}
int main()
{
FastRead
int n;
memset(dp,-1,sizeof dp);
if(!DP(0,0,n))
cout << "*" << endl;
else
{
for(int i=0;i<s.size();i++)
cout << ans[i];
cout << endl;
}
}
Page
12
******* Longest Common Subsequence ( LCS ) *******
int dp[1005][1005];
string s,s1,ans;
int main()
{
memset(dp,-1,sizeof(dp));
cin >> s >> s1;
cout << LCS(0,0) << endl;
ans = "";
findLCS(0,0);
}
Page
13
********** Longest Increasing Subsequence **********
Code 1 :
const int MAX = 1005;
int dp[MAX],dr[MAX],N,a[MAX];
int LIS(int u)
{
if(dp[u]!=-1)
return dp[u];
int maxi = 0;
for(int i=u+1; i<N; i++)
{
if(a[u]<a[i] && LIS(i)>maxi)
{
maxi = LIS(i);
dr[u] = i;
}
}
return dp[u] = 1+maxi;
}
void printLIS(int start)
{
while(dr[start]!=-1)
{
cout << "Index : " << start+1 << "\t";
cout << "Value : " << a[start] << endl;
start = dr[start];
}
cout << "Index : " << start+1 << "\t";
cout << "Value : " << a[start] << endl;
}
int main()
{
cin >> N;
memset(dp,-1,sizeof(dp));
memset(dr,-1,sizeof(dr));
cout << "Size : " << maxLIS << " " << endl;
cout << "Starting Index : " << start+1 << " " << endl;
int n;
cin >> n;
ll a[n+2] , mx = 0 , ans;
map < ll,ll > f;
for(int i=0;i<n;i++)
Page
14
{
cin >> a[i];
f[a[i]] = f[a[i]-1]+1;
if(f[a[i]] > mx)
{
mx = f[a[i]];
ans = a[i];
}
}
vector < ll > v;
for(int i=n-1;i>=0;i--)
{
if(a[i] == ans)
{
ans--;
v.push_back(i+1);
}
}
cout << v.size() << endl;
for(int i=v.size()-1;i>=0;i--)
cout << v[i] << " ";
cout << endl;
}
Code 2 :
int dp[10][105] , coin[105] , N;
int coinChange(int i,int amount)
{
if(i==N)
{
if(amount==0)
return 1;
else
return 0;
}
else if(dp[i][amount]!=-1)
return dp[i][amount];
int p1 = 0 , p2 = 0;
if(amount-coin[i]>=0)
p1 = coinChange(i,amount-coin[i]);
p2 = coinChange(i+1,amount);
Page
15
***************** Bellman Ford **************
struct edge
{
int u,v,w;
edge(int _u,int _v,int _w)
{
u = _u;
v = _v;
w = _w;
}
};
const int MAX = 1e5+7 , INF = 1e7+7;
vector < edge > adj;
long long dist[MAX];
int par[MAX];
int V,E;
void bellman_ford(int src)
{
for(int i=1;i<=V;i++)
dist[i] = INF;
dist[src] = 0;
par[src] = -1;
for(int i=1;i<V;i++)
{
int flag = 0;
for(auto j : adj)
{
if(dist[j.v] > dist[j.u]+j.w)
{
dist[j.v] = dist[j.u]+j.w;
par[j.v] = j.u;
flag = 1;
}
}
if(!flag)
break;
}
}
void print_path(int src,int node)
{
vector < int > path;
int i = node;
while(i!=-1)
{
path.push_back(i);
i = par[i];
}
for(i=path.size()-1;i>=0;i--)
cout << path[i] << " ";
cout << endl;
}
bool negetive_cycle(int src)
{
bellman_ford(src);
for(auto i : adj)
{
if(dist[i.v] > dist[i.u]+i.w)
{
return true;
}
}
return false;
}
int main()
{
ios_base::sync_with_stdio(false);cin.tie(NULL);
int uu,vv,ww;
cin >> V >> E;
for(int i=0;i<E;i++)
{
Page
16
cin >> uu >> vv >> ww;
adj.push_back(edge(uu,vv,ww));
}
if(negetive_cycle(1))
cout << "Negetive Cycle is found!!\n";
else if(dist[V]<INF)
print_path(1,V);
else
cout << -1 << endl;
}
if(vis[x])
continue;
vis[x] = 1;
if(match[x] == -1 || DFS(match[x]))
{
match[x] = src;
return 1;
}
}
return 0;
}
int BPM(int n)
{
int cnt = 0;
for(int i=1; i<=n; i++)
{
memset(vis,0,sizeof vis);
if(DFS(i))
cnt++;
}
return cnt;
}
void init()
{
for(int i=0; i<MAX; i++)
adj[i].clear();
memset(match,-1,sizeof match);
}
int main()
{
init();
int n;
cin >> n;
Page
17
**************** DSU *****************
int par[130];
int Find(int u)
{
if(par[u] == u)
return u;
else return par[u] = Find(par[u]);
}
void Union(int u,int v)
{
u = Find(u) , v = Find(v);
par[u] = v;
}
int main()
{
for(int i=1;i<=28;i++)
par[i] = i;
int n;
cin >> n;
vector < string > ans;
string s,s1,temp;
cin >> s >> s1;
for(int i=0;i<n;i++)
{
if(Find(s[i]-'a') != Find(s1[i]-'a'))
{
Union(s[i]-'a',s1[i]-'a');
temp = s[i] , temp += " " , temp += s1[i];
ans.push_back(temp);
}
}
cout << ans.size() << endl;
for(auto i : ans)
cout << i << endl;
}
for(int i=0;i<e;i++)
{
cin >> u >> v;
in[v]++; out[u]++;
for(int i=1;i<=n;i++)
{
cout << "In and out degree of " << i << " is : ";
cout << in[i] << " " << out[i] << endl;
}
}
Page
18
*************** Floyd Warshal **************
const int mx = 1005 , inf = INFINITY;
int N,E;
int adj[mx][mx],path[mx][mx];
void floydWarsh()
{
for(int k=1; k<=N; k++)
{
for(int i=1; i<=N; i++)
{
for(int j=1; j<=N; j++)
{
if(adj[i][j]>adj[i][k]+adj[k][j] && adj[i][k]!=inf && adj[k][j]!=inf)
{
adj[i][j] = adj[i][k]+adj[k][j];
path[i][j] = path[i][k];
}
}
}
}
}
void findPath(int i,int j)
{
vector < int > vec;
while(i!=j)
{
if(i==-1)
{
cout << "No Path Found!!\n";
return;
}
vec.push_back(i);
i = path[i][j];
}
vec.push_back(i);
cout << "Path : ";
for(auto i:vec)
{
cout << i << "->";
}
cout << endl;
}
int main()
{
int u,v,w;
cin >> N >> E;
for(int i=1; i<=N; i++)
{
for(int j=1; j<=N; j++)
{
path[i][j] = -1;
adj[i][j] = inf;
}
}
for(int i=1; i<=N; i++)
adj[i][i] = 0, path[i][i] = i;
Page
19
******* Minimum Spanning Tree ( Kruskal ) ***********
const int mx = 1005;
struct edge
{
int u,v,w;
};
int N,E,par[mx];
int Find(int n)
{
if(par[n]==n)
return n;
return par[n] = Find(par[n]);
}
int kruskal()
{
int ans = 0 , cnt = 0 , uu , vv;
for(int i=1;i<=N;i++)
par[i] = i;
for(int i=0; i<E; i++)
{
uu = Find(adj[i].u) , vv = Find(adj[i].v);
if(uu!=vv)
{
par[Find(uu)] = vv;
cnt++;
ans += adj[i].w;
if(cnt==N-1)
break;
}
}
return ans;
}
int main()
{
int uu,vv,ww;
edge get;
get.u = uu;
get.v = vv;
get.w = ww;
adj.push_back(get);
}
sort(adj.begin(),adj.end(),cmp);
cout << kruskal() << endl;
}
Page
20
******** Minimum Spanning Tree Prim’s Algo ********
const int MAX = 100005;
struct node
{
int u,w;
node(){}
node(int _u,int _w)
{
u = _u;
w = _w;
}
};
bool operator<(node a,node b)
{
return a.w > b.w;
}
int cost[MAX],vis[MAX],n,e;
priority_queue<node> pq;
vector < pii > adj[MAX];
int main()
{
cin >> n >> e;
int u,v,w;
for(int i=0;i<e;i++)
{
cin >> u >> v >> w;
adj[u].push_back(pii(v,w));
adj[v].push_back(pii(u,w));
}
Page
21
************** Topological Sort **************
const int MAX = 105;
struct Node
{
int first,second;
Node(){} /// Default Constructor
Node(int _f,int _s)
{
first = _f;
second = _s;
}
};
bool operator<(Node A,Node B)
{
return A.second > B.second;
}
vector < int > adj[MAX];
int in[MAX];
int node,edge;
bool vis[MAX];
priority_queue < Node> q;
void topSort_BFS()
{
while(!q.empty())
{
int v,u = q.top().second , w = q.top().first;
q.pop();
cout << u << endl;
for(int i=0;i<adj[u].size();i++)
{
v = adj[u][i];
in[v]--;
if(!vis[v] && in[v]==0)
{
vis[v] = 1;
q.push(Node(in[v],v));
}
}
}
}
int main()
{
int u,v;
for(int i=0;i<edge;i++)
{
cin >> u >> v;
adj[u].push_back(v);
in[v]++;
}
for(int i=1;i<=node;i++)
{
if(in[i]==0)
q.push(Node(in[i],i));
}
topSort_BFS();
}
Page
22
*********** Dijkstra Algorithom Code ************
const int mx = 1e5+5;
int main()
{
int u,v,w;
cin >> N >> E;
for(int i=0;i<E;i++)
{
cin >> u >> v >> w;
cost[u].push_back(pii(v,w));
cost[v].push_back(pii(u,w));
}
if(dijkstra(1,N))
{
vector < int > path;
int i = N;
while(i!=-1)
{
path.push_back(i);
i = par[i];
}
for(int i=path.size()-1;i>=0;i--)
cout << path[i] << " ";
cout << endl;
}
else
cout << -1 << endl;
}
Page
23
*********** Fractional Knapsack Code *************
vector < pii > v;
bool cmp(pii a,pii b)
{
return a.second*b.first > b.second*a.first;
}
int main()
{
int N,W,weight,price,temp,ans = 0;
cin >> N >> W;
for(int i=0;i<N;i++)
{
cin >> weight >> price;
v.push_back(pii(weight,price));
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<N;i++)
{
temp = min(W,v[i].first);
W -= temp;
ans += temp*v[i].second;
}
cout << "Maximum Cost : " << ans << endl;
}
Page
24
************** Bitwise Sieve **************
bool Check(int N,int pos){ return (bool)(N & (1<<pos));}
void Set(int &N,int pos){ N=N | (1<<pos);}
const int MAX = 1e8+5;
int prime[(MAX>>5)+2];
vector < ll > primes;
void sieve()
{
int lim = sqrt(MAX);
for(int i=3; i<=lim; i+=2)
{
if(!Check(prime[i>>5],i&31))
{
for(int j=i*i; j<=MAX; j+=(i<<1))
{
Set(prime[j>>5],j&31);
}
}
}
primes.push_back(0);
primes.push_back(2);
int last = 1;
for(int i=3; i<=MAX; i+=2)
{
if(!Check(prime[i>>5],i&31))
{
primes.push_back(i+primes[last]);
last++;
}
}
}
int main()
{
sieve();
int n;
cin >> n;
while(n--)
{
int x,y;
cin >> x >> y;
cout << primes[y]-primes[x-1] << endl;
}
}
Page
25
*********** Count divisors of N factorial *************
vector < ll > primes;
const int MAX = 1000005;
bool prime[MAX];
void sieve(int n)
{
for(int i=2; i<=n; i++)
prime[i] = 1;
for(int i=2; i<=n; i++)
{
if(prime[i]==1)
{
primes.push_back(i);
for(int j=2; i*j<=n; j++)
prime[i*j] = 0;
}
}
}
ll factorialDivisors(ll n)
{
ll res = 1;
for(int i=0;primes[i]<=n;i++)
{
ll exp = 0;
ll p = primes[i];
while(p <= n)
{
exp += (n/p);
p *= primes[i];
}
res *= (exp+1);
}
return res;
}
int main()
{
sieve(MAX);
ll n;
while(cin >> n)
{
cout << factorialDivisors(n) << endl;
}
return 0;
}
Page
26
************ Find Digits of factorial of N ************
#define ll long long
int findDigits(int n)
{
if(n<=1)
return n;
double digits = 0;
for(int i=2;i<=n;i++)
digits += log10(i);
return floor(digits)+1;
}
int main()
{
int n;
while(cin >> n)
{
cout << findDigits(n) << endl;
}
}
*********** Finding Divisors of a number ************
Code for Finding Number of divisors and then printing them :
Page
27
Code for Number of Divisors ( NOD ) :
ll super(ll n)
{
if(n&1)
return n*((n+1)>>1);
else
return (n>>1)*(n+1);
}
ll divisorSum(ll n)
{
ll sum = 0 , lim = sqrt(n) , x = super(lim);
for (ll i = 1; i <= lim; i++)
{
sum += (n/i)*i;
if(i*i != n)
{
sum += super(n/i);
sum -= x;
}
}
return sum;
}
int main()
{
FastRead
ll a,b,sum;
cin >> a >> b;
sum = divisorSum(b)-divisorSum(a-1);
cout << sum << endl;
}
Page
28
******** Compute N Factorial under modulo P ********
vector < int > primes;
const int MAX = 1000005;
bool prime[MAX];
void sieve(int n)
{
for(int i=2; i<=n; i++)
prime[i] = 1;
for(int i=2; i<=n; i++)
{
if(prime[i]==1)
{
primes.push_back(i);
for(int j=2; i*j<=n; j++)
prime[i*j] = 0;
}
}
}
int bigMod(int a,int b,int M)
{
if(b==0)
return 1;
ll x = bigMod(a,b/2,M);
x = (x*x)%M;
if(b&1)
x = (x*a)%M;
return x;
}
int largestPower(int n,int p)
{
int cnt = 0;
while(n)
{
n /= p;
cnt += n;
}
return cnt;
}
int fact(int n,int p)
{
int res = 1;
for(int i=0;primes[i]<=n;i++)
{
int k = largestPower(n,primes[i]);
res = (res*bigMod(primes[i],k,p))%p;
}
return res;
}
int main()
{
sieve(MAX);
int n,p;
while(cin >> n >> p)
{
cout << fact(n,p) << endl;
}
return 0;
}
Page
29
************ Prime Factorization Code *************
vector < int > v;
void primeFact(int n)
{
while(n%2==0 && n>0)
{
v.push_back(2);
n /= 2;
}
for(int i=3;i<=sqrt(n);i+=2)
{
while(n%i==0 && n>0)
{
v.push_back(i);
n /= i;
}
}
if(n>2)
v.push_back(n);
}
int main()
{
int n;
while(cin >> n)
{
v.clear();
int k = n;
if(n == 0)
break;
if(n<0)
v.push_back(-1) , n *= -1;
primeFact(n);
cout << k << " = ";
for(int i=0;i<v.size();i++)
{
cout << v[i];
if(i == v.size()-1)
{
cout << endl;
break;
}
cout << " x ";
}
}
}
int BLOCK_SIZE;
struct data
{
int l,r,idx;
bool operator<(const data &b) const
{
int x = l/BLOCK_SIZE, y = b.l/BLOCK_SIZE;
if(x != y)
return x < y;
return r < b.r;
}
};
data Q[MAX];
Page
30
int a[MAX], ans[MAX], freq[MAX];
unordered_set < int > s;
void add(int x)
{
if(!freq[x])
s.insert(x);
freq[x]++;
}
void del(int x)
{
freq[x]--;
if(!freq[x])
s.erase(x);
}
void MO(int n,int q)
{
BLOCK_SIZE = sqrt(n);
sort(Q,Q+q);
int st = 0, en = -1;
if(i)
{
if(l == Q[i-1].l-1 && r == Q[i-1].r-1)
{
ans[idx] = ans[Q[i-1].idx];
continue;
}
}
while(en < r)
{
en++;
add(a[en]);
}
while(en > r)
{
del(a[en]);
en--;
}
while(st > l)
{
st--;
add(a[st]);
}
while(st < l)
{
del(a[st]);
st++;
}
int mx = 0, mn = 1e9;
for(auto j : s)
{
mx = max(mx,freq[j]);
mn = min(mn,freq[j]);
}
ans[idx] = mx-mn;
}
for(int i=0; i<q; i++)
printf("%d\n",ans[i]);
}
Page
31
int main()
{
int n,q;
scanf("%d%d",&n,&q);
MO(n,q);
}
a = "#"+a;
setHash(a);
int l1 = a.size() , l2 = b.size();
ll hashValue = Hasher(b);
int cnt = 0;
for(int i=1;i+l2<=l1;i++)
{
int l = i , r = i+l2-1;
if(getHash(l,r) == hashValue)
cnt++;
}
cout << "Case " << cas++ << ": " << cnt << endl;
}
}
Page
32
************* Combinatorics **************
const int MAX = 2e5+10;
const int MOD = 1e9+7;
ll f[MAX];
void calcFact()
{
f[0] = 1;
for(int i=1;i<MAX;i++)
f[i] = (f[i-1]*i)%MOD;
}
ll bigMod(ll a,ll b)
{
if(b == 0)
return 1;
ll x = bigMod(a,b/2);
x = (x*x)%MOD;
if(b&1)
x = (x*a)%MOD;
return x;
}
ll nCr(ll n,ll r)
{
ll x = (f[n]*bigMod((f[r]*f[n-r])%MOD,MOD-2))%MOD;
return x;
}
int main()
{
FastRead
calcFact();
string s;
cin >> s;
for(int i=1;i<=n;i++)
{
lf[i] = lf[i-1];
if(s[i] == '(')
lf[i]++;
}
for(int i=n;i>=1;i--)
{
rt[i] = rt[i+1];
if(s[i] == ')')
rt[i]++;
}
ll ans = 0 , x , y;
for(int i=1;i<=n;i++)
{
x = nCr(lf[i]+rt[i] , min(lf[i],rt[i]));
y = nCr(lf[i-1]+rt[i] , min(lf[i-1],rt[i]));
ans = (ans+x-y)%MOD;
if(ans<0)
ans += MOD;
}
Page
33