YZOI Easy Round 2_回文串 string

原文链接:http://laphets1.gotoip3.com/?id=18

Description

给出一个由小写字母组成的字符串,其中一些字母被染黑了,用?表示。已知原来的串不是

一个回文串,现在让你求出字典序最小的可能的串。像’a’,’aba’,’abba’这样对称的串叫做回

文串。

每个测试点有5 组小测试点。

Input

5 行,5 个字符串。

Output

5 行,5 个字符串。若无解,输出”Orz,I can not find it!”

这个题目主要就是利用了一种贪心的思想  总的思路就是先把所有的问号先将用最小的字母‘a‘来代替  假如说不行的话 就将最后一个问号用b来代替  这样得到的便一定是最优的

接下来便是分类讨论的事了 :

如果这个给出的串没有问号  那么便直接判断这个串是不是回文  如果是的话我们便肯定无法再将其变成回文 这里直接输出ORZ便行  反之如果本来就不是回文  直接输出当前的串即可

接下来  对于只有一个问号的情况 我们便先判断有没有这样一种情况存在  即是否只有一个问号  并且这个问号刚好在这个奇数串的中间位置  如果存在 那么便不需要管这个问号是什么(他对该串是否为回文无影响)那么只需要再做一遍回文的check() 同理进行输出 那么如果这个处于中间的问号之前还有一个或多个问号呢  这是我们只需要再将中间问号之前的那个串再看做一个新串 再次找出他这个串中最后一个问号的所处位置 并把这些所有的问号都代以a 再用check()做一遍  如果还是回文 那么我们便把这个新串里的最后一个问号改成 b 即可

另外,对于不符合以上情况的情况(即这个串不是奇数串 然后有一个及以上的问号)  我们便可直接扫一遍 把所有的问号变成 a 并把最后一个 问号记录下来 并再执行一次check()  如果不是回文 那么当然便是最优解了 此时输出即可  当然如果还是回文 那么同样把新串的最后一位标记变成 b  输出即可 此时则一定为最优解  ......

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=10000;
char s[maxn];
int n,cnt,last;
bool check()
{
	for(int i=1;i<=n;i++)
		if(s[i]!=s[n+1-i])
			return false;
	return true;
}
void print()
{
	for(int i=1;i<=n;i++)
		printf("%c",s[i]);
	printf("\n");
}
void work()
{
	if(cnt==1)
	{
		if(check())
			printf("Orz,I can not find it!\n");
		else
		{
			s[last]=‘a‘;
			print();
			return;
		}
	}
	int t=0;
	for(int i=1;i<last;i++)
		if(s[i]==‘?‘)
			t=i;
	for(int i=1;i<=n;i++)
		if(s[i]==‘?‘)
			s[i]=‘a‘;
	if(check())
		s[t]=‘b‘;
	print();
}
void solve()
{
	cnt=0;
	for(int i=1;i<=n;i++)
	{
		if(s[i]==‘?‘)
		{
			cnt++;
			last=i;
		}
	}
	if(cnt==0)
	{
		if(check())
		{
			printf("Orz,I can not find it!\n");
			return;
		}
		else
		{
			print();
			return;
		}
	}
	if((n&1)&&(last==(n+1)>>1))
	{
		work();
		return;
	}

	for(int i=1;i<=n;i++)
		if(s[i]==‘?‘)
			s[i]=‘a‘;
	s[last]=‘b‘;
	print();
}
int main()
{
	freopen("string.in","r",stdin);
	freopen("string.out","w",stdout);
	for(int t=1;t<=5;t++)
	{
		scanf("%s",s+1);
		n=strlen(s+1);
		solve();
	}
}
时间: 2024-10-11 10:33:09

YZOI Easy Round 2_回文串 string的相关文章

YZOI Easy Round 2_化简(simplify.c/cpp/pas)

Description 给定一个多项式,输出其化简后的结果. Input 一个字符串,只含有关于字母x 的多项式,不含括号与分式,没有多余的空格. Output 一个字符串,化简后的多项式,按照次数从大到小的顺序输出各项. Input Sample x^3+3*x^4-2*x^3+1-x Output Sample 3*x^4-x^3-x+1 Hint 每项系数<10,次数<6,项数<20.字符串长度不超过100. 很烦的模拟   代码如下: #include<iostream&g

回文串最大长度

1)lettcode题目: Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example: Input: "babad" Output: "bab" Note: "aba" is also a valid answer. class Solution { publ

HDOJ 5421 Victor and String 回文串自己主动机

假设没有操作1,就是裸的回文串自己主动机...... 能够从头部插入字符的回文串自己主动机,维护两个last点就好了..... 当整个串都是回文串的时候把两个last统一一下 Victor and String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/262144 K (Java/Others) Total Submission(s): 30    Accepted Submission(s): 9 Probl

Codeforces Round #427 (Div. 2) D. Palindromic characteristics(Manacher求回文串)

题目链接:Codeforces Round #427 (Div. 2) D. Palindromic characteristics 题意: 给你一个串,定义k-th回文串,让你求每个k-th的数量. 题解: manacher处理好后做一下dp就行了. 当然也可以直接dp不用manacher. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 5 cons

Codeforces Global Round 7D(马拉车/PAM,回文串)

1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int maxi,R,pos,ans_pos,p[2000007]; 5 string str,ans_str,tmp; 6 void Manacher(string s){//马拉车模板,p数组存放当前位置为轴回文串的最大长度 7 int siz=s.size(); 8 memset(p,0,sizeof(int[siz]));

Hdu 5340 Three Palindromes 最大回文串 Manacher

Three Palindromes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 80    Accepted Submission(s): 21 Problem Description Can we divided a given string S into three nonempty palindromes? Input Fir

Hdu5785-Interesting(回文串处理)

Problem Description Alice get a string S. She thinks palindrome string is interesting. Now she wanna know how many three tuple (i,j,k) satisfy 1≤i≤j<k≤length(S) , S[i..j] and S[j+1..k] are all palindrome strings. It's easy for her. She wants to know

LeetCode(125):验证回文串

Easy! 题目描述: 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 示例 2: 输入: "race a car" 输出: false 解题思路: 验证回文字符串是比较常见的问题,所谓回文,就是一个正读和反读都一样的字符串,比如"level"或者"n

最少回文串--牛客网(秋招备战专场三模)-C++方向

题目描述:一个字符串从左向右和从右向左读都完全一样则是回文串,给定一个字符串,问该字符串中的字符所能组成的最少的回文串的个数为多少 解题思路:如果一个字符出现的次数为偶数,则必能组成回文串,如果一个字符出现奇数次,只能自己组成回文串,题目中问最少的回文串数目,即求出现次数为奇数次的字符个数即可,定义a存储每个字符出现的次数,统计出现奇数次的字符的个数,即为输出 1 #include <iostream> 2 #include <string> 3 using namespace s