總結
題意:構造一個t字符串,滿足irreducible anagram ,輸出yes,否則輸出no
reducible anagram = k*irreducible anagram(k>=2)
滿足三個條件某一個即可:
第一:l==r(k>=2,才能構成reducible anagram)
第二:s[l] != s[r]
不同字符是這個題的核心點
這種字符串,可以構造一個把t字符串中與s[r]相同的字符串全部放在t的最左端,其他字符隨便放置,你會發現sk要找到tk匹配,那麼s1-k跟t1-k一定不匹配,因爲這個時候,t1-k全是s[r],但是s1-k中有一個字符s[l]。
第三:cnt>=3
上面已經處理了首尾不同字符的問題,那麼首尾相同字符
情況1:字符串不同字符數量爲1
顯而易見,|s|>=2,沒辦法構造,t是唯一的,一定是reducible anagram
情況2:字符串不同字符數量爲2
s1的所有情況,最特殊的就是就是s1的首尾字符不一樣,這種一定可以構成一個irreducible anagram,但是隻是s1== t1,剩下的就可以完成s1-k ==t1-k,就滿足了k>=2
情況3:字符串不同字符數量爲3
直接舉例子:s=aabcaa
把c構造在t的最左邊,b構造在最右邊
c要滿足一個那麼c所在的區間一定t[1,4], a和c不同
d要滿足一個那麼d所在的區間一定t[3,6] d和a不同
兩個區間一合併,就是隻是一個irreducible anagram
情況4:字符串不同字符數量爲大於等於4
就把多餘的字符串上面字符串aabcaa的bc的中間就可以了
const int N=2e5+5;
int dp[N][26],cnt[26];
signed main()///構造算法
{
IOS;
//file();
string str;
cin>>str;
int n=str.size();
for(int i=1;i<=n;i++)
{
for(int j=0;j<26;j++)
dp[i][j]=dp[i-1][j];
dp[i][str[i-1]-'a']++;
}
int q;
cin>>q;
while(q--)
{
int l,r,sum=0;
cin>>l>>r;
for(int i=0;i<26;i++)
if(dp[r][i]-dp[l-1][i])
sum++;
if(r==l||str[l-1]!=str[r-1]||sum>=3)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}