【字符串哈希】CH1401 兔子与兔子

描述
很久很久以前,森林里住着一群兔子。有一天,兔子们想要研究自己的 DNA 序列。我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母),然后我们每次选择两个区间,询问如果用两个区间里的 DNA 序列分别生产出来两只兔子,这两个兔子是否一模一样。注意两个兔子一模一样只可能是他们的 DNA 序列一模一样。

输入格式
第一行一个 DNA 字符串 S。
接下来一个数字 m,表示 m 次询问。
接下来 m 行,每行四个数字 l1, r1, l2, r2,分别表示此次询问的两个区间,注意字符串的位置从1开始编号。
其中 1 ≤ length(S), m ≤ 1000000

输出格式
对于每次询问,输出一行表示结果。如果两只兔子完全相同输出 Yes,否则输出 No(注意大小写)

样例输入
aabbaabb
3
1 3 5 7
1 3 6 8
1 2 1 2
样例输出
Yes
No
Yes

字符串哈希的练习模板题。

  • 坑:strlen很慢,放在循环里会超时。
  • s+1输入字符串,s[0]是结束符,如果传入strlen(s)会返回1;
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int maxn=1e6+23;
char s[maxn];
int m,l1,l2,r1,r2;
ull f[maxn],p[maxn];
Read the rest

【对顶堆】Running Median POJ – 3784

Running Median
Time Limit: 1000MS		Memory Limit: 65536K
Total Submissions: 3467		Accepted: 1606
Description

For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (middle value) of the elements received so far.
Input

The first line of input contains a single integer P, (1 ≤ P ≤ 1000), which is the number of data sets that follow. The first line of each data set 
Read the rest

【坑】高数满分—pow的问题

Description

众所周知,qm的高数总是满分。这一天数学白痴锦鱼拿着一道数学题来问qm,qm不屑做这种简单的题,于是把这道题丢给你来完成。题目是这样的:给定a、b、c三个整数,求最大的整数x,满足xa+b*x<=c,其中xa表示x的a次方,b*x表示b乘以x。

Input

第一行输入三个整数a(1<=a<=10),b(0<=b<=1018),c(0<=c<=1018),分别对应题目中a、b、c三个整数。

Output

输出一个整数,表示所求的最大的x。

Sample Input

2 3 4

Sample Output

1
这题虽然是一道二分,但由于x^a可能过于大,所以x每次要去pow(c,1.0/a)避免爆炸。
xyjj说pow在计算longlong的时候会出现各种奇怪的问题(导致我WA了无数次),后来网上查了一下说是因为pow是计算的double所以会有精度丢失的问题,所以二分里面的pow要自己写……………….
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a,b,c;
ll qkpow(ll x,int p)
{
	if(p==0) return 1;
	if(p==1) return x; 
	
	ll y=qkpow(x,p>>1);
	
	y=y*y;
	
	if(p&1) 
	y=y*x;
	
	return y;
}
int main()
{
	cin>>a>>b>>c;
	ll l=0,r=(ll)pow((double)c,1.0/a);
	//if(b!=0) r=c/b;
	//r=min(r,(ll)pow(c,1.0/a));
	while(r-l>1)
	{
		ll mid=(r+l)>>1;
		if(qkpow(mid,a)+b*mid<=c)
		{
			l=mid;	
		}
		else
		{
			r=mid;
		}
	}	
	if(qkpow(r,a)+r*b<=c) cout<<r;
	
Read the rest