比赛的时候怎么没看这题啊...血亏T T 对每种字符建一个bitset,修改直接改就好了,查询一个区间的时候对查询字符串的每种字符错位and一下,然后用biset的count就可以得到答案了... #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> #include<bitset> #define ll…
题目:http://codeforces.com/contest/914/problem/F 可以对原字符串的每种字母开一个 bitset .第 i 位的 1 表示这种字母在第 i 位出现了. 考虑能不能匹配上,可以把可行的 “开头” 设成 1 : 这样的话,枚举到匹配串的第 i 位,字符是 ch,就找出原字符串里 ch 对应的那个 bitset ,则 bt[ ch ] >> ( i-1 ) 的这些位置可以是合法的开头: 所以每次 ans 每个位置都赋成 1 ,然后对于匹配串的每个位置, &a…
时间限制:4000ms 单点时限:4000ms 内存限制:256MB 描述 你知道KMP吗?它是用于判断一个字符串是否是另一个字符串的子串的算法.今天我们想去扩展它. 在信息理论中,在两个相同长度的字符串之间的海明码距离是:两个字符串相同位置对应的字符不同的位置数目.换种说法,它表示将一个字符串转化为另一个字符串所需要改变字符的最小数目. 下面这些字符串之间的海明码距离: "karolin"和"kathrin"是3. "karolin"和&quo…
[题目]F. Substrings in a String [题意]给定小写字母字符串s,支持两种操作:1.修改某个位置的字符,2.给定字符串y,查询区间[l,r]内出现y多少次.|s|,Σ|y|<=10^5,time=6s. [算法]Bitset [题解]假设S的长度为n,那么对每个字符建一个长度为n的bitset,1表示该位置为该字符,修改时直接修改. 查询的时候将字符串y所有的字符的bitset,按顺序错位and,这样最后得到1表示y为子串,count一下即可. 复杂度O(n^2/32),…
题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个字母串,要求支持以下操作: 修改一个位置的字母 查询一段区间中,字符串$s$作为子串出现的次数 Solution 1 Bitset 每次匹配一段,可以看成,依次考虑每个位置,匹配的位置对应的起点取交集.例如: 大概就这个意思. bitset的count似乎很慢,可以用__builtin_popcount来数中间的位数,然后暴力数两端的位数会快很多.感觉手写倍增法数位数最快.但有人说前面那个内联函数比手写的$O(\log \log…
之前有过区域赛,简化版问题: 给定一个小写字符组成的字符串S,(|S|<1e5,下标从1开始),现在有Q种操作,对于每个操作Q(Q<=1e5),输入opt, 如果opt==1,输入x,c,表示把S[x]改为c,(c是小写字母). 如果opt==2,输入L,R,和字符串T,输出S[L-R]中有多少个字串==T(字符串可以重叠),(|T|<=100). (其中opt==2的询问次数小于1e3) -------------------------------------------分界线---…
Problem J. TriatripTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/attachments Description The travel agency “Four Russians” is offering the new service for their clients. Unlike other agencies that only suggest one-way…
题意 题目链接 Sol Orz jry 和上一个题一个思路吧,直接bitset乱搞,不同的是这次有了修改操作 因为每次修改只会改两个位置,直接暴力改就好了 #include<bits/stdc++.h> using namespace std; const int MAXN = 1e5 + 10; char s[MAXN], tmp[MAXN]; int N, q; bitset<MAXN> ans, B[27]; main() { scanf("%s %d",…
/** 题目:zoj3228 Searching the String 链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3441 题意:给定一个长度为N(N <= 105)的目标串,然后再给定M(M <= 105)个长度不大于6的字符串, 问这些字符串在目标串的出现次数(分可重叠和不可重叠两种). 题解:可以覆盖情况下,直接建立自动机求次数.注意可能出现类型相同以及字符串相同.所以用map标记: 不可以覆盖情况下,直接…
前言:其实我还是有点不懂,有点郁闷了,算了直接把代码放上去把. 方法一: Scanner input=new Scanner(System.in); System.out.println("请输入一个字符"); String str=input.next(); char[] strChar=str.toCharArray(); //声明集合,把之存在集合中 Map<Character,Integer> map=new HashMap<>(); for(int i…
1.1. 训练描述:[方法.String类] 一.需求说明:定义如下字符串: String str = “javajfiewjavajfiowfjavagkljjava”; 二.请分别定义方法统计出: 字符串中:字符j的数量 字符串中:字符串java的数量 定义MainApp类,包含main()方法: 在MainApp类中,定义以下两个方法: 1.2. 操作步骤描述 1)         可以统计一个字符串中,某个字符出现的次数: public static int countChar(Stri…
[Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得这q条路径都能被满足.(如果有一条边是从a->b),而经过它的路径是从b->a,那么久不满足).只需要判断,不用输出方案. 分析 对于一个有向环,显然它可以允许各个方向的路径通过.所以我们只要把无向图里的边-双联通分量建成环,然后就不用考虑了.影响答案的只有桥. 所以我们求出所有桥,然后缩点,把图…
B. Vile Grasshoppers time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output The weather is fine today and hence it's high time to climb the nearby pine and enjoy the landscape. The pine's trunk in…
方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如果大于最大元素则忽略,如果小于最大元素则将次元素送入堆中,并将堆的最大元素删除,调整堆的结构; 方法3:使用快速排序的原理,选择出数组中第K大的元素,select(a[], k, low, high) 选取数组中a[high]为基准,将数组分割为A1和A2,A1中的元素都比a[high]小,A[2]中的元素都…
public class MinHeap { /* * * Top K个问题,求给定数据中最小的K个数 * * 最小堆解决:堆顶元素为堆中最大元素 * * * */ private int MAX_DATA = 10;//最小10个数 private int[] data;//存储数据 private int len;//当前存储长度,考虑到元素个数可能没有10个,这个时候全部输出 private MinHeap() { data = new int[MAX_DATA]; len=0; } pr…
求一个Map中最大的value值,同时列出键,值 方法1. public static void main(String[] args){  Map map=new HashMap();  map.put("d", 761);  map.put("g", 7);  map.put("a", 761);  map.put("c", 34);    int value=0;     String maxKey = null;   …
案例三: 统计共同好友 任务需求: 如下的文本, A:B,C,D,F,E,OB:A,C,E,KC:F,A,D,ID:A,E,F,LE:B,C,D,M,LF:A,B,C,D,E,O,MG:A,C,D,E,FH:A,C,D,E,OI:A,OJ:B,OK:A,C,DL:D,E,FM:E,F,GO:A,H,I,J 求出哪些人两两之间有共同好友,及他俩的共同好友都是谁 b -ac -ad -aa -b c -b b -e b -j 解题思路: 写两个mapreduce 第一个MR输出结果如:b -> a…
作用:求一个字符串中的最长子串,同时还可以求所有子串的长度. 题目链接: https://vjudge.net/contest/254692#problem/B 最长回文串长度的代码: int Manacher(string s) { string t = "$#"; ; i < s.size(); ++i) { t += s[i]; t += "#"; } vector<); ; , id = , resLen = , resCenter = ; ;…
相关介绍:  求取数组中最大连续子序列和问题,是一个较为"古老"的一个问题.该问题的描述为,给定一个整型数组(当然浮点型也是可以的啦),求取其下标连续的子序列,且其和为该数组的所有子序列和中值为最大的.例如数组A={1, 3, -2, 4, -5},则最大连续子序列和为6,即1+3+(-2)+ 4 = 6.解决该问题的算法有四种,根据其时间复杂度的高低,下面分别为这四种算法做介绍. 第一种:时间复杂度为O(N^3)  该算法也是最容易想到的,很直观的算法,其算法的思路为,穷举数组中以某…
package com.swift; import java.util.Arrays; public class ArrayTest { public static void main(String[] args) { /* * 定义一个int类型的数组,数组中元素为{5,7,3,9,4}. * 求出数组中的最小值,并判断最小值是否为偶数,如果是偶数则输出“最小值为偶数”,如果不是偶数则输出“最小值为奇数”.打印如下 */ int arr[]= {5,7,3,9,4}; Arrays.sort(…
#pragma once #include<stdio.h> #include<stdlib.h> #define StackSize 100 typedef int DataType; //栈元素类型定义 typedef struct{ DataType stack[StackSize]; int top; }SeqStack; //将栈初始化为空栈仅仅须要把栈顶指针top置为 void InitStack(SeqStack *S){ S->top=0;//把栈顶指针置为0…
最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是字典树和KMP的结合,然后去思考一下KMP的原理,然后就是在字典树上实现KMP 这里最重要的思想可能就是fail的思想,就像KMP一样,匹配失败后,有一个next的数组去回溯(最长公共前缀后缀) 如何理解了KMP的话,感觉这个不会很难理解,字典树是一个非常简单的东西就不用讲了吧. HDU - 222…
Keywords Search HDOJ-2222 本文是AC自动机的模板题,主要是利用自动机求有多少个模板出现在文本串中 由于有多组输入,所以每组开始的时候需要正确的初始化,为了不出错 由于题目的要求是有多少字符串出现过,而不是出现过多少次,所以出现过的模板串就不能再计数了,所欲需要置-1. 不要忘记build函数应该在insert函数之后调用,也不要忘记调用. //AC自动机,复杂度为O(|t|+m),t表示文本串的长度,m表示模板串的个数 #include<iostream> #incl…
import java.util.Arrays; import java.util.PriorityQueue; public class ch1_5_2求无序序列中第k小的元素 { public static void main(String[] args) { PriorityQueue<Integer> pq=new PriorityQueue<Integer>(); int a[]= new int[20]; int k=3; for(int i=0;i<a.leng…
1 /*题目:正整数n若是其平方数的尾部,则称n为同构数 2 如:5*5=25, 25*25=625 3 问: 求1~99中的所有同构数 4 */ 5 //分析:将1-99分为1-9和10-99,用取余的方法得到位数,再判断是否相等 6 7 public class Question4 { 8 public static void main(String[] args) { 9 System.out.println("1-99范围内的同构数如下:"); 10 //for循环遍历1~99…
Problem 求[1..N]中素因子数最多且最小的数n,N充分大. Solution 将任意自然数n (n>2) 分解 n=p1^k1 * p2^k2 * p3^k3 * ... * Pm^km p1<p2<...<pm 则n的因子数为 (k1+1)*(k2+1)*...*(km+1) 假设[1..N](n充分大)中因子数最多且最小的数为n,则显然可见下面两个结论 (1)n的素因子连续即 n=2^k1*3^k2*5^k3 ... (2)k1 >= k2 >= k3 &…
求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复杂度为O(n). 求最长回文子串这个问题,我听说有个分治+拓展kmp的算法,后缀数组也可以. 但是对于求回文串来说,manacher算法肯定有很多其他算法没有的优点. 现在进入正题: 首先,在字符串s中,用rad[i]表示第i个字符的回文半径,即rad[i]尽可能大,且满足: s[i-rad[i],…
//求n个数中的最小k个数        public static void TestMin(int k, int n)        {            Random rd = new Random();            int[] myArray = new int[n];            int[] newArray = new int[k]; for (int i = 0; i < n; i++)            {                // rand…
/* * 2 一个子串在整串中出现的次数. * "loveerlovetyloveuiloveoplove" * 思路: * 1,要找的子串是否存在,如果存在获取其出现的位置.这个可以使用indexOf完成. * 2,如果找到了,那么就记录出现的位置并在剩余的字符串中继续查找该子串, * 而剩余字符串的起始位是出现位置+子串的长度. * 3,以此类推,通过循环完成查找,如果找不到就是-1,并对 每次找到用计数器记录.  * 使用 indexOf()获取某个字符子串在整串中的位置,还使用…
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 分析:首先最先想到的是遍历从1到n的每个数,判断每个数中包含1的个数,再相加. 时间复杂度:如果输入数字为n,n有O(logn)位,我们需要判断每个数字的每一位是不是为1,所以时间复杂度为O(n*logn).如果输入数字很大的时候,就需要大量的计算,效率不高. 接下来观察规律: 从个位到最高位,我们判断每一位1出现的次数.比如 对于数2…