https://ac.nowcoder.com/acm/contest/551#question
B CSL 的英语考试
根据映射改一下单词,然后还是直接比较字典序
#include
#include
#include
using namespace std;
int main()
{
map<char,char> m1;
int n;
cin>>n;
for(int j=0;j<26;j++){
char c;
cin>>c;
m1[c]='a'+j;
}
for(int k=0;k<n;k++){
string a ,b;
cin>>a;
cin>>b;
for(int i=0;i<a.size();i++){
a[i] = m1[a[i]];
}
for(int i=0;i<b.size();i++){
b[i]=m1[b[i]];
}
if(a<b){
cout<< "<" <<endl;
}else if(a>b){
cout<<">"<<endl;
}else{
cout<<"="<<endl;
}
}
return 0;
}
C CSL 的密码
总数减去重复出现的个数
题目有随机生成的字样,就是说长度很长的时候认为不可能有重复出现的可能
这样减少循环次数,否则会超时
#include
using namespace std;
typedef long long ll;
ll n, m, sum = 0;
set<string> dict;
string s;
int main()
{
cin >> n >> m >> s;
long long lap = 0, ans = (n - m + 1) * (n - m + 2) / 2;
for (int i = m; i <= min((int)s.size(), 8); i++) {
for (int j = 0; j <= s.size() - i; j++) {
string t(s.begin() + j, s.begin() + j + i);
if (dict.find(t) == dict.end()) {
dict.insert(t);
} else {
lap++;
}
}
// sum += dict.size();
dict.clear();
}
printf("%lld", ans - lap);
return 0;
}
CSL 的字符串
类似与计算器,字母一个个压栈:
当前字符字典序 > 栈顶元素字典序 且前面没有出现过可以直接压进去
当前字符字典序 < 栈顶元素字典序 且后面还有改栈顶元素出现,弹栈 直到不满足条件将该元素压栈
需要统计各个字符出现的数量以及栈内是否有改字符 分别用两个数组来统计
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define debug(x) cout<<#x<<": "<
string removeDuplicateLetters(string s){
int cnt[256]={0};
bool visit[256]={0};
string ret = "";
for(int i=0;i<s.size();i++){
cnt[s[i]]++;
}
for(int i=0;i<s.size();i++){
cnt[s[i]]--;
if(visit[s[i]]){
continue;
}
if( s[i] > ret.back()){
ret.push_back(s[i]);
visit[s[i]] = true;
}else{
while(s[i]<ret.back() && cnt[ret.back()]>0){
visit[ret.back()] = false;
ret.pop_back();
}
ret.push_back(s[i]);
visit[s[i]] = true;
}
}
return ret;
}
int main(){
string s;
cin>>s;
cout<<removeDuplicateLetters(s)<<endl;
return 0;
}
E CSL 的魔法
正序序列对应逆序序列,只要达到这种对应即可 不需要将两个序列都排成有序之后求交换次数
//// 离散化数组,然后并查集找环
//////.CSL的魔法
//////数组之间的大数对小数,小数对大数
#include
using namespace std;
#define maxn (int)1e5+1000
#define up(i,x,y) for(int i=x;i<=y;i++)
#define down(i,x,y) for(int i=x;i>=y;i--)
#define deg(x) { cerr<<#x<<": "<
typedef long long ll;
int a[maxn],b[maxn]; //两个数组
struct node
{
int x;
int id;
}t_a[maxn],t_b[maxn]; ////a,b的大小映射index
bool cmp(node a,node b)
{
return a.x<b.x;
}
int fa[maxn]; //并查集维护
int findd(int x)
{
if(x==fa[x])return fa[x];
return fa[x]=findd(fa[x]);
}
void unionn(int x,int y)
{
int a=findd(x),b=findd(y);
if(a!=b)
fa[a]=b;
}
void compress(int x[],int n) //离散化数组
{
vector<int>xs;
up(i,1,n)
xs.push_back(x[i]);
sort(xs.begin(),xs.end());
xs.erase(unique(xs.begin(),xs.end()),xs.end());
//舍去xs中重复的part,并sort
up(i,1,n)x[i]=lower_bound(xs.begin(),xs.end(),x[i])-xs.begin()+1;
}
#define INF (int)1e9
int main()
{
int n;scanf("%d",&n);
up(i,1,n)scanf("%d",&a[i]);
up(i,1,n)scanf("%d",&b[i]);
////离散化
compress(a,n);compress(b,n);
//up(i,1,n)cout<
//////////////////////
//up(i,1,n)cout<
//up(i,1,n)cout<
up(i,1,n)t_a[i].x=a[i],t_a[i].id=i;sort(t_a+1,t_a+1+n,cmp);
up(i,1,n)t_b[i].x=b[i],t_b[i].id=i;sort(t_b+1,t_b+1+n,cmp);
////
int ans=INF;
{ //1
up(i,1,n)fa[i]=i;
up(i,1,n) //for a
{
int x=a[i];
int t_id=t_b[(n+1-x)].id;
unionn(x,a[t_id]);
}
int sum=0;
up(i,1,n)if(fa[i]==i)sum++;
ans=min(ans,n-sum);
}
/*{ //2 next
up(i,1,n)fa[i]=i;
up(i,1,n) //for a
{
int x=b[i];
int t_id=t_a[(n+1-x)].id;
unionn(x,b[t_id]);
}
int sum=0;
up(i,1,n)if(fa[i]==i)sum++;
ans=min(ans,n-sum);
}*/
cout<<ans<<endl;
}
F CSL 的神奇序列
找规律
v [ i ] = v [ i − 1 ] ∗ ( i ∗ 2 − 1 ) v[i] = v[i-1]*(i*2-1)%mod; v[i]=v[i−1]∗(i∗2−1)
乘以一个每次大2的奇数
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const ll mod = 998244353;
ll v[1000005];
int main()
{
ll w,q;
cin>>w>>q;
v[0] = v[1] = 1;
for(int i = 2;i <= 1000000;i++) v[i] = v[i-1]*(i*2-1)%mod;
int n;
while(q--){
scanf("%d",&n);
printf("%lld\n",v[n]*w%mod);
}
return 0;
}
F CSL 的神奇序列
文件输入输出?
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
const ll MOD = 998244353;
const int INF = 0x3f3f3f3f;
const int maxn = 1e6 + 10;
int n;
ll w, q;
ll arr[maxn];
void RUN()
{
while (cin >> w >> q)
{
arr[1] = w;
for (int i = 2; i < maxn; ++i) arr[i] = ((i - 1) << 1 | 1) * arr[i - 1] % MOD;
while (q--)
{
cin >> n;
cout << arr[n] << "\n";
}
}
}
int main()
{
#ifdef LOCAL_JUDGE
freopen("Text.txt", "r", stdin);
#endif // LOCAL_JUDGE
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
RUN();
#ifdef LOCAL_JUDGE
fclose(stdin);
#endif // LOCAL_JUDGE
return 0;
}