您的位置:首页 > 其它

Code Forces 81 A. Plug-in 深搜||巧妙字符串处理

2013-11-11 20:09 323 查看
给出一个字符串,相同的字母对应相同的颜色,然后规则跟祖玛一样,只是2个颜色相同就可以消除,并且可以连锁

输出消除后最后剩下的字符串。

深搜,枚举每一个字符,然后

如果和后一个相同,

1 标记已经访问,

2 然后对左边最近一个没有被访问和(left)右边最近一个没有被访问的(right)进行深搜,

如果仍然可以消除则重复第2步骤。

中间处理的细节很多...比如left和right不越界,每次遇到不能消除的或者遇到了可以消除的都要更新left(下标不同),否则如果从str[x]==str[x+1]从left=x-1;暴搜回去TLE;

每次消除2个之后都要从left往左搜,搜一个没有访问过的

#include<stdio.h>
#include<string.h>
using namespace std;
char str[211111];
int vis[211111];
int main(){
while(scanf("%s",&str)!=EOF){
memset(vis,0,sizeof(vis));
int left=0,right=0,len=strlen(str);
for(int i=0;i<len-1;i++){
if(vis[i])continue;
if(str[i]==str[i+1]){
vis[i]=vis[i+1]=1;
right=i+2;
while(left>=0&&vis[left]){
if(left-1>=0)left--;
else break;
}
while(right<len&&left>=0&&(!vis[left])&&(!vis[right])&&str[left]==str[right]){
vis[left]=1,vis[right]=1;
left--,right++;
while(left>=0&&vis[left]){
if(left-1>=0)left--;
else break;
}
}
}
else left=i;
}
for(int i=0;i<len;i++){
if(!vis[i])printf("%c",str[i]);
}
printf("\n");
}
return 0;
}


下面是看别人的思路然后写的...

利用了CF是每组实例都重新运行一次程序的特点

逐个字符读入,然后如果当前读入的(str[i])跟之前最近的一个相同,直接把下次访问的下标改成str[i-1](str[i]和str[i-1]消除了)否则i++...

so easy......

#include<stdio.h>
int main(){
char str[1111111];
scanf("%c",&str[0]);
int i=1;
while(scanf("%c",&str[i])!=EOF){
if(str[i]==str[i-1])i=i-1;
else i++;
}
str[i]='\0';
printf("%s\n",str);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐