题目链接:https://codeforces.com/contest/1673/problem/B

大意就是,给一个字符串,对于其任意一个子串  s ,然后给出 u 、v (字符串中的元素),是的uv在子串s中出现的次数相差不大于1
如果满足就yes  ,不满足就no


一个智商检测题,咳咳。我做了四十分钟,想了好长时间┭┮﹏┭┮
想了好几个方法,直到第四个思路的时候才做出来(还WA了好几次),题解把思路写的很明确了

abacdbcded

bacdb

code:


#include<bits/stdc++.h>
using namespace std;
string a;
bool sign[30]={};
int last[30]={};
int main()
{
	//任意一个子串中    的     出现的次数最多的一个元素  比  出现次数最少的一个元素  多2
	//  那么就 no   否则   就yes
	
	//   思路 :  暴力  暴力枚举 l 和  r,找到区间,暴力求区间内最多出现元素的次数 和 最小出现元素的次数
	//  复杂度 :n^ 4    显而易见 ,不行
	
	//   思路:  两个相同的数挨在一起,且存在其他的数,那么一定pass 
	
	//思路: yes 的情况,   abab 情况(两个一定不相连)   aaaaa 情况(相连但是  就一个元素)
	
	// ok  两个一定不相连,如果相连 只有一种情况,那就是  全是一个元素
	
	
	//思路:两个相同数的位置  l  和 r   ,r-l  必须等于  元素种类数量 
	//补充:   有个测试点 没过 ,输出no,应该是yes 。
	//  也就是说, 两个数的位置相减  不等于元素种类数量,但是可以yes。找这样的特判情况 
	//  当记录的位置时 0 表示没有记录过这里有问题,可能第一个元素正好记录了 0 ,那么之后的不应该进行首次记录的特判 
           //特判这里其实,把默认值弄成-1就什么事都没有了,稳过
	
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int sum=0;
		memset(sign,false,sizeof sign);
		memset(last,0,sizeof last);
		
		cin>>a;
		for(int i=0;i<a.size();i++)
		{
			if(sign[a[i]-96]==false)
				sum ++;
			sign[a[i]-96] = true;
		}
		
		
		int i=0;
		for(;i<a.size();i++)
		{
			if(last[a[i]-96]==0&&a[0]!=a[i]||i==0)
			{
				last[a[i]-96] = i;//当前位置 
			}else   //去对比 
			{
				if(i - last[a[i]-96] < sum) 
					break;
			}
			last[a[i]-96] = i;
		} 
		if(i<a.size())
		{
			printf("NO\n");
		}else
		{
			printf("YES\n");
		}
	 } 
}