题目链接:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690
注意了,似乎航电的重挂数据有点离谱。。。。醉了。。。线段树也过不了了,不知道其他题怎么样。。。
#include
#include
#include
#define mod 9973
using namespace std;
const int N=100005;
char s[N];
struct node
{
int l,r,v;
}node[N<<2];
int cnt=0;
void build(int l,int r,int rt)
{
node[rt].l=l;
node[rt].r=r;
node[rt].v=1;
if(l==r){
node[rt].v=(int)s[cnt++]-28;
return;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
node[rt].v=(node[rt<<1].v*node[rt<<1|1].v)%mod;
}
void Insert(int p,int t,int rt)
{
if(node[rt].l==node[rt].r&&p==node[rt].l){
node[rt].v=t;
return ;
}
int mid=(node[rt].l+node[rt].r)>>1;
if(p<=mid) Insert(p,t,rt<<1);
else Insert(p,t,rt<<1|1);
node[rt].v=(node[rt<<1].v*node[rt<<1|1].v)%mod;
}
int query(int l,int r,int rt) // 注意,这里是区间更新;之前写成了单点更新,TLE到死啊。。。
{
if(node[rt].l==l&&r==node[rt].r)
return node[rt].v;
int mid=(node[rt].l+node[rt].r)>>1;
if(r<=mid) return query(l,r,rt<<1);
else if(l>mid) return query(l,r,rt<<1|1);
else return query(l,mid,rt<<1)*query(mid+1,r,rt<<1|1)%mod;
}
int main()
{
int t;
int l,r;
while(~scanf("%d",&t)){
scanf("%s",s);
int n=strlen(s);
cnt=0;
build(1,n,1);
while(t--){
scanf("%d%d",&l,&r);
printf("%d\n",query(l,r,1));
}
}
return 0;
}
#include
#include
#include
#define LL __int64
#define mod 9973
using namespace std;
LL inv[100010]={0};
char s[100100];
LL H[100100];
// 计算逆元方法一:
LL mod_pow(LL x, LL n) {
LL res = 1;
while(n) {
if(n & 1) res = res * x % mod;
x = x * x % mod;
n >>= 1;
}
return res%mod;
}
int main()
{
inv[1]=1;
inv[0]=1;
// 计算逆元方法二:
for(int i=2;i
#include
#include
#include
using namespace std;
string s[201];
string add(string a,string b)
{
string ans="";
int aa[1000]={0},bb[1000]={0};
int aLen=a.size();
int bLen=b.size();
int MaxLen=max(aLen,bLen);
for(int i=0;i=0;i--)
ans+=aa[i]+'0';
return ans;
}
int main()
{
int n;
s[0]="1",s[1]="1";
for(int i=2;i<201;i++){
s[i]=add(s[i-1],s[i-2]);
}
while(cin>>n){
cout<
天啦噜,更新一波,大家看仔细了,这两个代码有什么区别,前一个昨晚好好的AStar上AC今天死活WA...无奈,找队友AC代码对数据。。。
s[0]="";n=0竟然是正整数,也符合条件1<=n<=200,长知识了。。。。醉了,n=0输出为空。。。
#include
#include
#include
using namespace std;
string s[205];
string add(string a,string b)
{
string ans="";
int aa[1000]={0},bb[1000]={0};
int aLen=a.size();
int bLen=b.size();
int MaxLen=max(aLen,bLen);
for(int i=0;i=0;i--)
ans+=aa[i]+'0';
return ans;
}
int main()
{
int n;
//freopen("out.txt","w",stdout);
s[0]="1",s[1]="1";
for(int i=2;i<202;i++){
s[i]=add(s[i-1],s[i-2]);
}
s[0]="";
//for(int i=1;i<=200;i++)
while(cin>>n){
//cout<
#include
#include
#include
const int N=26;
struct node{
int flag; // 记录该单词出现的次数;
node *next[N];
node(){
flag=0;
memset(next,0,sizeof(next));
}
};
node *p,*pre,*head=new node();
void Insert(char s[])
{
p=head;
int i=0;
while(s[i]){
int id=s[i++]-'a';
if(p->next[id]==NULL) p->next[id]=new node();
p=p->next[id];
p->flag++; // 标记该分支字母出现的个数;
}
//p->flag++; // 标记改单词出现过,并且记录出现的次数;
}
// 返回该单词出现的次数;
int Query(char s[])
{
p=head;
int i=0;
while(s[i]){
int id=s[i++]-'a';
if(p->next[id]==NULL) return 0;
p=p->next[id];
}
return p->flag;
}
// 不能删除,删除会导致TLE,不删除容易出现内存泄漏MLE
int deal(node *T)
{
for(int i=0;inext[i]!=NULL)
deal(T->next[i]);
}
free(T);
return 0;
}
// 该单词的计数-cnt;
void Deal(char s[],int cnt)
{
p=head;
int i=0;
while(s[i]){
int id=s[i++]-'a';
p=p->next[id];
p->flag-=cnt;
}
for(int i=0;inext[i]=NULL;
}
//deal(p);
return ;
}
int main()
{
int n;
char s1[35],s2[35];
while(~scanf("%d",&n)){
head=new node();
for(int i=0;i
#include
#include
#include
#include
#include
using namespace std;
int minP(string s,int len)
{
int i=0,j=1,k=0;
while(i0) i+=k+1; // j开始的位置更小;
else j+=k+1; // i开始的位置更小或者相等;
if(i==j) j++;
k=0; // 连续相同的个数置为0;
}
}
return min(i,j);
}
int main()
{
string s;
int n;
cin.sync_with_stdio(false);
while(cin>>n){
mapMap;
for(int i=0;i>s;
int len=s.size();
s+=s;
int t=minP(s,len);
s=s.substr(t,len);
cout<