http://codeforces.com/contest/412
最大的感悟就是真为我的英语捉急~~
A:要是2*k<=n,就先把梯子移到最左边,然后在按个右移,print,反之,先右移,再左移
B:从大到小排序,输出s[k]
C:按个比较,要是与先前结果相同continue,都是字母但不同为?,与字母不同并且不是?,就是x
D:拓扑排序,倒着输出
E:邮件adress的标准,字母/数字/_(但只有字母有效,此处邮件名不能以_/数字开始)@字母.字母;然后计算@前的字母数与.后的字母数,相乘求和
A:
#include <iostream>
#include <cstdio>
#include<cstring>
using namespace std;
const int M=150;
char s[M];
int vis[M];
int main()
{
int n,k,i,j;
while(~scanf("%d%d",&n,&k))
{
scanf("%s",s+1);
int len=strlen(s+1);
if(2*k<=n)///left
{
for(i=0;i<k-1;i++)
printf("LEFT\n");
printf("PRINT %c\n",s[1]);
i=2;
while(i<=len)
{
printf("RIGHT\n");
printf("PRINT %c\n",s[i]);
i++;
}
}
else ///left
{
for(i=0;i<len-k;i++)
printf("RIGHT\n");
printf("PRINT %c\n",s[len]);
i=len-1;
while(i>=1)
{
printf("LEFT\n");
printf("PRINT %c\n",s[i]);
i--;
}
}
}
return 0;
}
B:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <vector>
#include <stack>
using namespace std;
const int M=150;
int s[M];
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,k,i,j;
while(~scanf("%d%d",&n,&k))
{
for(i=0;i<n;i++)
scanf("%d",&s[i]);
sort(s,s+n,cmp);
printf("%d\n",s[k-1]);
}
return 0;
}
C:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <vector>
#include <stack>
using namespace std;
const int M=100005;
char ans[M],s[M];
int main()
{
int n,i,j,k;
while(~scanf("%d",&n))
{
int len;
for(i=0;i<n;i++)
{
scanf("%s",s);
len =strlen(s);
if(i==0)
{
//strcpy(ans,s);
for(j=0;j<len;j++)
ans[j]=s[j];
ans[j]='\0';
continue;
}
j=0;
while(s[j]!='\0')
{//puts(s);
if(ans[j]=='0'){
j++;
continue;
}
if(s[j]=='?'){
j++;
continue;
}
if(s[j]>='a'&&s[j]<='z')
{
if(ans[j]=='?')
ans[j]=s[j];///此处由于搞错,WR,,,,,
else if(ans[j]!=s[j]&&ans[j]!='?')
ans[j]='0';
j++;
}
}
}
for(i=0;i<len;i++)
if(ans[i]=='0')
printf("?");
else if(ans[i]=='?')
printf("x");
else printf("%c",ans[i]);
printf("\n");
}
return 0;
}
D:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <vector>
#include <stack>
using namespace std;
const int M=3*10000+5;
vector<int>vt[M];
int vis[M],order[M];
int n,m,c;
void dfs(int u)
{
if(vis[u])
return ;
vis[u]=1;
for(vector<int>::iterator it=vt[u].begin();it!=vt[u].end();++it)
{
int v=*it;
if(!vis[v])
dfs(v);
}
order[c++]=u;
}
int main()
{
int i,j,k;
int a,b;
while(~scanf("%d%d",&n,&m))
{
for(i=1;i<=n;i++)
vt[i].clear();
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
vt[a].push_back(b);
}
memset(vis,0,sizeof(vis));
c=0;
for(i=1;i<=n;i++)
{
if(!vis[i])
{
dfs(i);
}
}
printf("%d",order[0]);
for(i=1;i<c;i++)
printf(" %d",order[i]);
printf("\n");
}
return 0;
}
E:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <vector>
#include <stack>
using namespace std;
const int M=1000005;
char s[M];
int isletter(int i)
{
if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
return 1;
return 0;
}
int main()
{
__int64 len,i,j,k,l,sum;
while(~scanf("%s",s))
{
sum=0;
len=strlen(s);
for(i=0;i<len;i++)
{
if(s[i]=='@')
{
l=0;
for(j=i-1;j>=0;j--)
{
if(s[j]=='@'||s[j]=='.')
break;
if(isletter(j))
l++;///开始时字母
}
for(j=i+1;j<len;j++)
{
if(s[j]=='@'||s[j]=='_')
break;///@ --.之间是数字和字母
if(s[j]=='.')
{
if(j==i+1)///@.之间没有字母,无意义
break;
for(k=j+1;k<len;k++)
{
if(!isletter(k))///.后必须是字母
break;
}
sum+=(k-j-1)*l;
//cout<<l<<" "<<k-j-1<<endl;
i=j;
break;
}
}
}
}
cout<<sum<<endl;
//printf("%I64d\n",sum);
}
return 0;
}