题目大意:给n个字符串,每一个字符串能够经过扔掉一些字母将剩下的字母重排获得新的字符串,求n个字符串都能拼出的字符串且长度最大,如有多个输出字典序最小c++
直接对每一个字母取个min便可spa
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 10005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } int N; char s[55]; int t[30],a[30]; void Solve() { read(N); for(int i = 0 ; i < 26 ; ++i) a[i] = 50; for(int i = 1 ; i <= N ; ++i) { scanf("%s",s + 1); int l = strlen(s + 1); memset(t,0,sizeof(t)); for(int j = 1 ; j <= l ; ++j) t[s[j] - 'a']++; for(int j = 0 ; j < 26 ; ++j) a[j] = min(a[j],t[j]); } for(int i = 0 ; i < 26 ; ++i) { for(int j = 1 ; j <= a[i] ; ++j) { putchar('a' + i); } } enter; } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); }
大意:给n条和x轴平行的线,m条和y轴平行的线,求全部矩形的面积和code
就是二维的任意连续子段和相乘便可orm
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 10005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } const int MOD = 1000000007; int N,M,s[2],l[2]; int inc(int a,int b) { return a + b >= MOD ? a + b - MOD : a + b; } int mul(int a,int b) { return 1LL * a * b % MOD; } void update(int &x,int y) { x = inc(x,y); } void Solve() { read(N);read(M); int x; for(int i = 1 ; i <= N ; ++i) { read(x); x = (x + MOD) % MOD; update(l[0],inc(mul(i - 1,x),MOD - s[0])); update(s[0],x); } int y; for(int i = 1 ; i <= M ; ++i) { read(y); y = (y + MOD) % MOD; update(l[1],inc(mul(i - 1,y),MOD - s[1])); update(s[1],y); } out(mul(l[0],l[1])); } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); }
大意:一个只包含AB的串,A能够变成BB,B能够变成AA,三个连续相同字母能够删除,问S的一个子串可否变成T的一个子串字符串
把A标值成1,把B标值成2,能够发现一个字符串在取模3意义下和不改变get
而后能够发现21能够变成12数学
用数学概括法能够证实两个字符串和相等必定能够互相转化,就是把S经过操做和T调成等长度,若是第K + 1个数相等,那么S能够转化成Tit
其他状况不妨是S的K + 1是1,T的K + 1是2,若是S中含有2能够用21和12的交换把2换过去,不然S就全是1,T就全是2,此时二者长度必然是3的倍数,那么把S全部的1变成2,删掉3的整数倍个2可获得Tio
这道题的题目名称有点皮form
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 100005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } char s[2][MAXN]; int Q; int sum[2][MAXN]; void Solve() { scanf("%s%s",s[0] + 1,s[1] + 1); int l = strlen(s[0] + 1); for(int i = 1 ; i <= l ; ++i) { sum[0][i] = sum[0][i - 1]; if(s[0][i] == 'A') sum[0][i] += 1; else sum[0][i] += 2; } l = strlen(s[1] + 1); for(int i = 1 ; i <= l ; ++i) { sum[1][i] = sum[1][i - 1]; if(s[1][i] == 'A') sum[1][i] += 1; else sum[1][i] += 2; } read(Q); int a,b,c,d; for(int i = 1 ; i <= Q ; ++i) { read(a);read(b);read(c);read(d); if((sum[0][b] - sum[0][a - 1]) % 3 == (sum[1][d] - sum[1][c - 1]) % 3) {puts("YES");} else puts("NO"); } } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); }
就是若是一个大于等于2的数,连了一个大于等于2的数,那么以后的全部都会被固定
那么咱们就算前i个没有出现这种状况的方案数
咱们能够在i个后面接上固定下来的状况,也能够第i个直接到终点,也能够是某种X111111....的1须要延续到N以后
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 1000005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } const int MOD = 1000000007; int inc(int a,int b) { return a + b >= MOD ? a + b - MOD : a + b; } int mul(int a,int b) { return 1LL * a * b % MOD; } void update(int &x,int y) { x = inc(x,y); } int N; int sum[MAXN],dp[MAXN]; void Solve() { read(N); dp[0] = 1; sum[0] = 1; int ans = 0; for(int i = 1 ; i <= N ; ++i) { update(dp[i],dp[i - 1]); if(i >= 3) update(dp[i],sum[i - 3]); sum[i] = inc(sum[i - 1],dp[i]); } for(int i = 0 ; i <= N ; ++i) { if(i == N - 1) { update(ans,mul(dp[i],N - 1)); } else if(i == N) { update(ans,dp[i]); } else { update(ans,mul(dp[i],mul(N - 1,N - 1))); } if(i < N - 1) { int t = N - i - 1; update(ans,mul(dp[i],N - t)); } } out(ans);enter; } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); }
板刷了三页AtCoder…… 加油。。。。还有一页半……?