Strings in the Pocket 题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个字符串,问有多少种方法能使翻转a中一个的子串后能够和b相同 题解 分两种情况 a和b相同:用马拉车求回文子串个数 a和b不同:记录第一个和最后一个a不同于b的位置L和R,判断[L,R]是不是回文串,如果不是,答案为0:如果是,匹配a的前部和b的后部.a的后部和前部,看能匹配几次 代码 #include<…
给出两个字符串,询问有多少种反转方法可以使字符串1变成字符串2. 如果两个串相同,就用马拉车算法找回文串的数量~ 如果两个串不同,从前往后找第一个不同的位置l,从后往前找第二个不同的位置r,反转l和r,判断是否成功~ 如果不成功,记为0 如果成功,以l和r为起点判断是否能反转,记录次数 #include<bits/stdc++.h> using namespace std; ; typedef long long ll; char s1[maxn]; char s2[maxn]; ]; ];…
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个串,可以翻转a串的一个区间,问有多少对l,r使得翻转后的a串等于b串 题解 沙比提,比赛时想了想两个串相等就用马拉车求回文子串个数,觉得两个串不相等情况很复杂就没想下去了,其实两个串不相等的情况更好处理 两个串不一样的话,一定需要翻转第一个和最后一个不相等的位置(关键),判一下中间是不是回文串,然后维护一下两边即可 特判只有一个字符不相等的时候 代码 #i…
思维~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int N; int main () { int T; scanf ("%d",&T); while (T--) { scanf ("%d",&N); ;i<=N;i++) { scanf ("%d",&a[i]); b[i]=a[i]; } sort…
贪心~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int vis[maxn]; set<int>s; set<int>::iterator it; vector<int>va[maxn],vb[maxn]; vector<int>v1,v2; int main() { int T; scanf ("%d",&T);…
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6003 题意 \(数组a通过交换一对数字,得到了b数组,给出x=\sum^n_{k=1}ka_k和y=\sum^n_{k=1}ka_k^2和b数组,问有多少对l,r(l<=r)能满足条件\) 题解 \(\frac{Y_2-Y_1}{X_2-X_1}=a_i+a_j=b_i+b_j\) \(X_2-X_1 = (a_i-a_j)*(j-i)=(b_j-b_i)*(j-i)\) \…
并查集算连通块的数量,集合的个数就是必然不开心的人数,再跑bfs,用优先队列维护~ #include<bits/stdc++.h> using namespace std; ; vector<int> g[maxn]; int father[maxn]; int N,M,T; int isRoot[maxn]; int visit[maxn]; int findfather (int x) { int a=x; while (x!=father[x]) x=father[x]; w…
构造+思维~ #include<bits/stdc++.h> using namespace std; ; int N,M,T; int visit[maxn]; stack<int> st; vector<int> vi; int main () { visit[]=; scanf ("%d",&T); while (T--) { scanf ("%d",&N); ;i<=N;i++) visit[i]=;…
目录 题目 解析 AC_Code @ 题目 第一题题意是一共有{0,1,2,3}四种数字供选择,问有多少个长度为n的序列满足所有m个条件,每个条件是说区间[L,R]内必须有恰好x个不同的数字. 第二题题意是10个数字供选择,问有多少个长度为n的序列满足所有m个条件,每个条件是说区间[L,R]数字的乘积必须是9的倍数. 解析 hdu6578 \(dp[t][i][j][k]\)表示填完前\(t\)个位置,{\(0,1,2,3\)}中出现的数字最后一次出现的位置排序后为\(t,i,j,k(t\gt…
传送:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意:给定两个串$S$和$T$,可以翻转$S$串中的任意一个子段,得到$T$.问,可以翻转的方案书有多少? 数据范围:多组数据.$1\leq|S|\leq2\times10^5$,$\sum|S|\leq2\times10^7$. 分析:很明显需要分类讨论$S$与$T$比较的各种情况. 首先需要判断$S$串从左和从右找到与$T$开始不同的位置. $S$不可以翻转成…