蓝桥杯:字符串

题目链接

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2000 + 117;
char s[MAXN];
int len;
int a[MAXN];
int fact[MAXN];
int M;
int num, now;
void sub(int mul, int order) {//这里的操作是把a[i]删除
    int sum = fact[order];
    sum = sum * mul % M;
    now = ((now - sum) % M + M) % M;//减去sum在加M是为了防止负数出现
}
void add(int mul, int order) {
    int sum = fact[order];
    sum = sum * mul % M;
    now = (now + sum) % M;
}
void init() {//预处理幂次
    scanf("%s", s);
    scanf("%d", &M);
    fact[0] = 1;
    for(int i = 1; i < MAXN; i++) fact[i] = fact[i - 1] * 26 % M;//fact的作用是选择某一个位置如个位 十位
    len = strlen(s);
    for(int i = 0; i < len; i++) {
        a[i] = s[i] - 'A';
        num = (num * 26 + a[i]) % M;
    }
}
int main() {
    init();
    if(num == 0) puts("0 0");
    else {
        bool pr = false;
        for(int i = 0; i < len && !pr; i++) {
            for(int j = 0; j < len && !pr; j++) {
                now = num;
                sub(a[i], len - 1 - i);//这里选择两个位置先减去在换位置相加
                sub(a[j], len - 1 - j);
                add(a[i], len - 1 - j);
                add(a[j], len - 1 - i);
                if(now == 0) {
                    printf("%d %d\n", i + 1, j + 1);//不要忘了加一
                    pr = true;
                }
            }
        }
        if(!pr) puts("-1 -1");
    }
    return 0;
}

发布了12 篇原创文章 · 获赞 0 · 访问量 225

猜你喜欢

转载自blog.csdn.net/weixin_43305294/article/details/104338293
今日推荐