1. 程式人生 > 其它 >Codeforces Round #747 (Div. 2) 題解C - Make Them Equal

Codeforces Round #747 (Div. 2) 題解C - Make Them Equal

Problem - C - Codeforces

思路分析:

首先我們要求出最小次數,可以得知我們最多隻需要兩步,取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;
}