给定一个字符串,问你是否可以移动两个数,让这个字符串中不出现”happiness”。如果是的话就输出两个位置。如果不能的话就输出no 如果happiness出现超过三次以上,一次只能破坏两个,所以一定是no 如果出现两次,记录每个的 h和i,将第一个的h和第二个的i调换即可。 如果出现一次,将第一个的h和i调换。 如果没有,输出 1 2 重点来了。数据可能是这样。 ahppiness,这样本来找不到,输出yes,但是移动12 后反而找到了。 很多人卡数据,应该是如果想输出固定的数,都会给你找到反例。。 怪不得我们wa了那么多次。。顺便提一下,第29个数据估计就是ahppiness 看的大神的代码,才明白了。我操,还是要读题啊。
#include <cstdio> #include <iostream> #include <map> using namespace std; int main() { //freopen("standard input","r",stdin); //freopen("output.txt","w",stdout); string s; string a="happiness"; cin>>s; int link1 [200005]; int link2[200005]; int j=1; int sum=0; if(s.length()<=8) { printf("YES\n"); printf("1 2\n"); return 0; } for(int i=0;i<s.length()-8;i++) { string l=s.substr(i,9); if(l==a) { link1[j]=i+1; link2[j]=i+5; sum++; j++; } } if(sum>2) puts("NO"); else if(sum==0) {puts("YES"); int ans1=1;int ans2=2; map<char,int>mp; for(int i=0;i<s.length();i++) { if(mp[s[i]]!=0) { ans1=mp[s[i]]; ans2=i+1; break; } else mp[s[i]]=i+1; } printf("%d %d\n",ans1,ans2); } else if(sum==2) { puts("YES"); printf("%d %d\n",link1[1],link2[2]);} else { puts("YES"); printf("%d %d\n",link1[1],link2[1]);} return 0; }