摘要:
递归式: 实例图解: 代码: 1 #include<stdio.h> 2 #include<string.h> 3 const int N=111; 4 int dp[N][N],f[N][N]; 5 char a[N],b[N],c[N]; 6 void LCS(char *a,char *b,i 阅读全文
摘要:
以下是输入测试: 1 #include<stdio.h> 2 const int N=1e8; 3 int main() 4 { 5 freopen("data.in","w",stdout); 6 for(int i=1;i<=N;i++) 7 printf("%d\n",i); 8 printf 阅读全文
摘要:
思路:用manacher求出每个位置的半径,相加即可。 代码:【rad[i]/2】即i这个位置的回文半径,添加的'#'代表长度为偶数的串。 阅读全文
摘要:
Manacher算法能够在O(N)的时间复杂度内得到一个字符串以任意位置为中心的回文子串。其算法的基本原理就是利用已知回文串的左半部分来推导右半部分。 首先,在字符串s中,用rad[i]表示第i个字符的回文半径,即rad[i]尽可能大,且满足:s[i-rad[i],i-1]=s[i+1,i+rad[ 阅读全文
摘要:
题意:N个星星(x,y,z),星星的等级等于x,y,z都小于等于它的星星数量,问每个等级有多少星星。 思路:最暴力的方法是三维树状数组。但是会超内存。所以我们对其中一维先排好序,然后用二维的做。 代码: 阅读全文
摘要:
题意:问你有多少个序列满足Ai < Aj > Ak and i < j < k. 思路:对每个数求它之前和之后分别有多少个个数比它小,两边相乘。最后求和。具体实现先用树状数组正序求,再反过来再用一遍树状数组。 代码:特别要注意的是题目中Ai的范围是从0开始,但是树状数组不能从0开始,所以统一加一处理 阅读全文
摘要:
题意:有一个n*n的矩阵,op==1时,在(x,y)增加值z,op==2时,求以(x1,y1)和(x2,y2)构成的矩阵的和。 思路:二维线段树。 代码: 参考文章:http://blog.csdn.net/hit_lingo/article/details/50845718 http://www. 阅读全文
摘要:
题意:求逆序数对数量。 思路一:暴力,O(N^2),超时。 思路二:虽然Ai很大,但是n比较小,可以离散化,得到每个Ai排序后的位置Wi,然后按照输入的顺序,每个Ai对答案的贡献是Wi-Sum(Wi-1)-1.Sum(x)表示1-x中在之前出现的总数,也即非逆序数对的数量,再减去Ai本身,就是Ai的 阅读全文