題目大意:給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…… 加油。。。。還有一頁半……?