UVa11988
来源:互联网 发布:君权级战列舰知乎 编辑:程序博客网 时间:2024/06/06 00:17
我果然是太菜,当初学指针形式的链表看p->next->next理解了2天,现在看用数组实现的也看了2天才明白。本来以为c语言那里学的还不错,现在我都想对自己呵呵了。
看了无数人的解释,最终还是看这位大佬的才明白。http://www.cnblogs.com/GeniusYang/p/5176454.html
其实整个代码核心就2句在插入字符那里 next[i]=next[cur]; next[cur]=i; 仔细体会体会。
在uva上用next当数组会有歧义,需换一个名字,就这一点CE了3遍。
不说了,上代码。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=100000+5;
int last,cur,nexxt[maxn];
char s[maxn];
int last,cur,nexxt[maxn];
char s[maxn];
int main()
{
while(scanf("%s",s+1)==1)
{
int n=strlen(s+1);
last=cur=0;
nexxt[0]=0;
for(int i=1;i<=n;i++)
{
char ch=s[i];
if(ch=='[') cur=0;
else if(ch==']') cur=last;
else //插入
{
nexxt[i]=nexxt[cur]; //现在插入的字符的指向的下一个位置(next)变成了cur指向的下一个位置(next)
nexxt[cur]=i; //而cur指向的下一个位置就指向了要插入字符的位置(i),这样就完成了插入,与上一句位置不能颠倒
if(cur==last) last=i;
cur=i; //移动光标
}
}
for(int i=0;i<=n;i++)
cout<<nexxt[i]<<' ';
cout<<'\n';
for(int i=nexxt[0];i!=0;i=nexxt[i])
printf("%c",s[i]);
printf("\n");
}
return 0;
}
{
while(scanf("%s",s+1)==1)
{
int n=strlen(s+1);
last=cur=0;
nexxt[0]=0;
for(int i=1;i<=n;i++)
{
char ch=s[i];
if(ch=='[') cur=0;
else if(ch==']') cur=last;
else //插入
{
nexxt[i]=nexxt[cur]; //现在插入的字符的指向的下一个位置(next)变成了cur指向的下一个位置(next)
nexxt[cur]=i; //而cur指向的下一个位置就指向了要插入字符的位置(i),这样就完成了插入,与上一句位置不能颠倒
if(cur==last) last=i;
cur=i; //移动光标
}
}
for(int i=0;i<=n;i++)
cout<<nexxt[i]<<' ';
cout<<'\n';
for(int i=nexxt[0];i!=0;i=nexxt[i])
printf("%c",s[i]);
printf("\n");
}
return 0;
}
/*以这个输入为例。
ABC[DE]F
首先在ABC的时候,是按顺序链接的 0->1->2->3 当遇到'['时,cur=0;所以 next[5]=next[0]; next[0]=5;这样 顺序就变成了 0->5->1->2->3;
然后到E这个字符,同样 next[6]=next[5];next[5]=6; 这样 顺序变成了 0->5->6->1->2->3;
然后到']' 这时候 cur=last=3; 然后到了F; next[9]=next[3]; next[3]=9;
这样 最后的顺序为 0->5->6->1->2->3->9; 这也是最后的打印顺序,注意 开头的0只是个开始,对应指针表示里的头指针,它本身不代表任何字符 因为s[0]不代表字符,s是从1开始的有字符。
当然,与链表一样 这个0可以有,没有也行,如果不从0开头 就需要设next[1]=0;然后,最后单独打印s[1];
核心就是 next[i]=next[cur]相当于指针创建中的 p->next=*L->next;(一个是让next[i]=0,一个是让p->next=NULL) next[cur]=i 相当于指针创建中的 *L->next=p;(一个让cur->i 一个让L的next->p)
*/
阅读全文
0 0
- uva11988
- uva11988
- UVA11988
- UVA11988
- UVa11988
- UVa11988
- UVa11988
- uva11988
- UVA11988
- uva11988(链表)
- uva11988 链表
- 链表指针uva11988
- UVA11988 Broken Keyboard
- uva11988 broken keyboard
- UVA11988 Broken Keyboard 链表
- UVa11988(linked list)
- Uva11988 Broken Keyboard
- 数组链表-----uva11988
- 从指向看JavaScript
- [iOS] 高仿 QQ、微信效果的图片浏览器(支持原图和缩略图、多种手势、CocoaPods)
- getComputedStyle
- 袁开红:特色小镇可以“做”但不能“作”
- 浅谈Java虚拟机的工作模式Client和Server。
- UVa11988
- Linux进程间通信概述
- 避免Block的循环引用
- C语言:动态分配内存,malloc()与realloc()区别
- c# swagger 笔记二
- 最近项目有个需要,需要动态截取输入字符串中的某些特殊字符组,使用正则表达式可以完成。记下备用
- Fox and Box Accumulation CodeForces
- 公共耦合
- 中国剩余定理求解同余线性方程组—(互素和非互素的情况)