题目:https://codeforces.com/contest/1109/problem/D
题意:
给出一段回文串,问最少对其剪切几次后进行重新拼接可以形成新的回文串
分析:输出无非三种情况:impossible 1, 2;
字符串长度为n;
impossible : n个或者n - 1个字符相同。
1:循环字符串,这个只要找出循环节进行循环,如果可以得到和原串不同的就是答案;
2: 从头找到一个长度小于 n / 2 的子串,从后边也找到相应的串,前后对换,判断得到的串是否符合要求;
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;
const int maxn = 100005;
char s[maxn];
int main()
{
cin >> s;
int cnt = 0;
char s1[maxn];
int n = strlen(s);
for(int i = 1;i < n;i ++)
{
if(s[i] != s[0]) cnt = 1;
}
if(cnt == 0)
{
cout << "Impossible" << endl;
}
else
{
for(int p = 1;p < n;p ++)
{
int t = 0;
int x = 0,flag = 0;
for(int k = p;k < n;k ++)
{
s1[t ++] = s[k];
}
for(int k = 0;k < p;k ++)
{
s1[t ++] = s[k];
}
for(int i = 0;i < n;i ++)
{
if(s1[i] != s[i])
{
flag = 1;
}
}
if(flag == 0)continue;
int l = 0,r = n - 1;
while(l <= r)
{
if(s1[l] != s1[r])
{
x = 1;
}
l ++;
r --;
}
if(x == 0) {
cout << "1" << endl;
return 0;
}
}
if(n % 2)
{
int a = 0;
int k = n / 2;
for(int i = k - 1;i >= 1;i --)
{
if(s[i] != s[0]) a = 1;
}
if(a == 0) cout << "Impossible" << endl;
else cout << "2" << endl;
}
else cout << "2" << endl;
}
return 0;
}