下午有道第一题,竟然不知道 & 比 ==的优先级低,导致浪费20分钟,囧啊


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
 int n;
 char t;
 scanf("%d\n",&n);
 while(n--)
 {
 int sum = 0;
 int last = -1;
 while(scanf("%c",&t) && t!='\n')
 {
 int temp = (int)t;
 if(((temp & 63) == 33) || ((temp&252 ) == 132))
 {
 sum++;
 }
 if(last != -1){
 if(
 (((last & 3) == 2) && ((temp & 240) == 16))
 ||(((last & 15) == 8 ) && ((temp & 192) == 64)) )
 {
 sum++;
 }
 }
 last = temp;

 }
 printf("%d\n",sum);
 }
 return 0;
}

第二题就不说了,自己没A题的经验,水题非要自己写结构体外加find导致写代码TLE,然后无语了20分钟发现牛人都是STL MAP直接过掉。唉,又一次被罚时没进前400,水平差要个T恤都这么难

修改FLEA.php的510行开始的getCache,writeCache,purgeCache一共3个函数,使用memcache库。

不过好像这样对于我的wb的优化感觉不大,还是仔细考虑,自己在程序逻辑上查询量大、更新少的需要的地方添加memcache比较重要。话说查询最多的可能就是Tweets了,可是实时变化。。唉。。。

memcached的使用很方便,但是原理很牛逼,推荐看mixi.jp人写的东西

http://tech.idv2.com/2008/07/10/memcached-001/

 function getCache($cacheId, $time = 900, $timeIsLifetime = true, $cacheIdIsFilename = false)
 {
 $memcache_obj = new Memcache;
 $memcache_obj->connect('localhost', 11211);
 $data = $memcache_obj->get($cacheId);
 if(!$data) return false;

 return $data !== false ? unserialize($data) : false;
 }

 function writeCache($cacheId, $data, $cacheIdIsFilename = false)
 {
 $data = serialize($data);

 $memcache_obj = new Memcache;
 $memcache_obj->connect('localhost', 11211);
 return $memcache_obj->set($data, $cacheId, MEMCACHE_COMPRESSED, 900);

 }

 function purgeCache($cacheId, $cacheIdIsFilename = false)
 {
 $memcache_obj = new Memcache;
 $memcache_obj->connect('localhost', 11211);
 return $memcache_obj->delete($cacheId);
 }

支持正则表达式比较。。。

select * from `tweets` where `nick` REGEXP `^leon`

任何TCP服务器都应该设置此选项,避免出现当服务器listen父进程崩溃后但已经存在子进程处理客户连接,在此情况下重启问题。

我的inilisten函数,用于建立listen的sockfd

int initlisten(int port)
{
  int listenfd;
  struct sockaddr_in servaddr;
  if( (listenfd = socket(AF_INET,SOCK_STREAM,0))< 0)
  {
       printf("socket error! %s\n",strerror(errno));
       return -1;
  }
  bzero(&servaddr,sizeof(struct sockaddr_in));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port = htons(port);
  int optval = 1;
  if(-1 == (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval))) )
  {
      printf("set REUSEADDR error! %s,%d\n",strerror(errno),port);
  }
  if( -1 == (bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))) )
  {
      printf("bind error! %s,%d\n",strerror(errno),port);
      return -1;
  }
  if( -1 == (listen(listenfd,1024)))
  {
      printf("listen error! %s,%d\n",strerror(errno),port);
      return -1;
  }
   return listenfd;
}

利用WNOHANG的waitpid来处理同时多个child终止,但unix只投递一个SIG_CHLD的情况。

当accept慢速系统调用被EINTR中断后应重启。


void sig_chld(int signo){
   pid_t pid;
   int stat;
   while((pid = waitpid(-1,&stat,WNOHANG)) >0 ){
      printf("child %d process terminated.\n",pid);
   }
   return;
}

int main(void){
   ...
   signal(SIGCHLD,sig_chld);
   while(1)
  {
     if((connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen)) < 0)
     {
         if(errno == EINTR)
             continue;
         else
             printf("accept error! %s",strerror(errno));
             return errno;
      }
      printf("get a connection\n");
      if((handlerpid = fork()) == 0)
      {
          handler(connfd);
          exit(0);
      }
      close(connfd);
  }
  ...
}
/*
e.g: input:   abcdefgegcsgcasse
     output:  abcdefg
     tips: 算法示例,只支持由小写字母构成的字符串,当然可以lastpos[256];
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
 char buf[128];
 scanf("%s",buf);
 int i,lastpos[26];
 for(i=0;i<26;i++)
 lastpos[i] = -1;
 int s=0,maxlen=0,maxs,maxe;
 int len=strlen(buf);
 for(i=0;i<len;i++)
 {
 if(s > lastpos[buf[i]-'a'])
 {
 lastpos[buf[i]-'a']=i;
 }
 else
 {
 int len = i-s;
 if(len > maxlen)
 {
 maxlen = len;
 maxs = s;
 maxe = i-1;
 }
 s = i;
 lastpos[buf[i]-'a']=i;
 }
 }
 for(i=maxs;i<=maxe;i++)
 printf("%c",buf[i]);
 printf("\n");
 return 0;
}