Codeforces Round #747 (Div. 2) 題解C - Make Them Equal
阿新 • • 發佈:2021-11-08
思路分析:
首先我們要求出最小次數,可以得知我們最多隻需要兩步,取x = n 和 x = n - 1 則一定能符合題意
因此我們只需判斷是否能通過0次或1次來滿足題意
1、對於0次
我們只需要先遍歷一遍字元陣列,看看是否有不滿足的即可
2、對於1次
我們可以遍歷所有的x(從1 - n),只要有一個x能滿足所有x的倍數位置上的字元都與c相同,那麼我們就一定能只用x使不符合題意位置上的字元變為c
3、如果上述兩種情況都不滿足,則輸出2、n和n-1即可
程式碼示例:
//#pragma comment(linker, "/STACK:10240000000000,10240000000000") //#pragma GCC optimize(2) #include <bits/stdc++.h> #define For(i,a,b) for (int i=(a);i<=(b);++i) #define Fod(i,b,a) for (int i=(b);i>=(a);--i) #define mls multiset #define lb lower_bound #define ub upper_bound #define pb push_back #define pob pop_back #define itt iterator #define lowbit(x) x & (-x) #define clr(x) memset(x, 0, sizeof(x)); typedef long long ll; typedef unsigned long long ull; using namespace std; const int MAXN = 0x7fffffff; const int MOD = 1000000007; const int N = 3e5 + 5; int main () { ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while(t--) { int n; char s[N]; char c; cin >> n >> c; For(i, 1, n) cin >> s[i]; bool ok = true; bool p = true; For(i, 1, n) if(s[i] != c) { ok = false; break; } if(ok) { cout << 0 << endl; continue; } else { For(i, 1, n) { bool flag = true; int ans = i; for(int j = i; j <= n; j += i) { if(s[j] != c) { flag = false; break; } } if(flag) { cout << 1 << endl; cout << ans << endl; p = false; break; } } } if(p) { cout << 2 << endl; cout << n-1 << " " << n << endl; } } return 0; }