Codeforces 1291 D(构造+思维)

题解:
当子串长为11或者串中字符种类为11,显然构造不出。

排除以上情况后,显然无论怎么分割子串,首尾字符是不可能划分到一起的。

思考极端情况时,划分为s[l]s[l]s[l+1r]s[l+1\sim r]或者s[lr1]s[l\sim r-1]s[r]s[r]
故问题转换成了如何使得tt的首尾字符与ss的首尾字符完全不同的构造情况。

首先,当ss串中字符种类多于22个时,三个字符只要挑22个放到首尾即可。
其次,当ss串中种类为22时:

  1. 如果ss串中s[l]s[r]s[l]≠s[r],我们只需要构造tt使得t[l]=s[r],t[r]=s[l]t[l]=s[r],t[r]=s[l]即可。

  2. 如果ss串中s[l]==s[r]s[l]==s[r]。那么假设存在一个tt符合题目要求使得ssirreducible anagram
    那么先初始化t=st=s,要构造一个符合要求的tt,还是从尽可能地构造s[l]!=t[l]s[l] != t[l]s[r]!=t[r]s[r] !=t[r]入手。初始状态下我们只要分隔开首尾,怎么构造都可以。
    第一种情况:
    我们从ll向右寻找一个ii,当s[i]==t[i]&&t[l]!=t[i],swap(t[l],t[i])s[i] ==t[i]\&\&t[l]!=t[i],swap(t[l],t[i]),那么必须放在一起的区域就变成了t[li]t[l\sim i]
    继续从rr向左寻找一个jj,当s[j]==t[j]&&t[r]!=t[j]swap(t[r],t[j])s[j]==t[j]\&\&t[r]!=t[j],swap(t[r],t[j]),那么必须放在一起的区域又多了t[jr]t[j\sim r]
    如果iijj都找到了,那么此时t[l]!=s[l]&&t[r]!=s[r]t[l]!=s[l]\&\&t[r]!=s[r]。就是至少划分成t[li],t[jr]t[l\sim i],t[j\sim r]
    s[i+1j1]s[i+1\sim j-1]无需划分。

    psps:如果只有一个找到,说明两种字符中,一种字符只有一个,
    那么无论怎么交换都不可能符合要求。

    第二种情况:
    我们从rr向左寻找一个jj,当s[j]==t[j]&&t[l]!=t[j],swap(t[l],t[j])s[j] ==t[j]\&\&t[l]!=t[j],swap(t[l],t[j]),那么必须放在一起的区域就变成 了t[lj]t[l\sim j]
    继续从ll向右寻找一个ii,当s[i]==t[j]&&t[r]!=t[i]swap(t[r],t[i])s[i]==t[j]\&\&t[r]!=t[i],swap(t[r],t[i]),那么必须放在一起的区域又多了t[ir]t[i\sim r]
    毫无疑问这两者会有相交的部分。但其实这两种寻找方式都是调换了两个相同的字符到l,rl,r,两个相同的字符到i.ji.j,实际上和上面那种交换是一样的。
    因此这种情况是构造不出来的。


代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
 
const int N = 2e5 + 10;
char s[N];
int ch[26], q;
int pre[N][26];
 
int main()
{
	scanf("%s%d", s + 1, &q);
	for(int i = 1; s[i]; i++) ch[s[i] - 'a']++;
	for(int i = 1; s[i]; i++) { 
		for(int j = 0; j < 26; j++)
			pre[i][j] = pre[i - 1][j];
		pre[i][s[i] - 'a']++;
	}
	
	while(q--) {
		int l, r;
		scanf("%d%d", &l, &r);
		if(l == r) puts("Yes");
		else {
			int t[26] = {0}, cnt = 0;
			for(int j = 0; j < 26; j++) t[j] = pre[r][j] - pre[l - 1][j];
			for(int j = 0; j < 26; j++) if(t[j]) cnt++;
			if(cnt > 2) puts("Yes");
			else if(s[l] != s[r]) puts("Yes"); 
			else puts("No"); 
		}
	}
	
	return 0;
} 
发布了102 篇原创文章 · 获赞 11 · 访问量 6687
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览